1. 程式人生 > >讀書筆記1——Apriori演算法詳解

讀書筆記1——Apriori演算法詳解

平時看書就是自認為看懂就算,結果在過一段時間,或是面試的時候別人問我貌似什麼都不記得。所以如果能把自己所看的,寫下來給比人講清楚我想是非常重要的。開始第一個簡單的機器學習演算法的解釋。參考資料主要是《資料探勘概率與技術》第三版。

    
 Apriori演算法的主要作用是尋找頻繁項集。進一步的是根據頻繁項集去產生關聯規則。在實際應用中類似啤酒和尿布這種故事就可以使用這種演算法去解決。

常用的概念
  • 項集:就是項的集合。如果在輸入時資料師 為了發現哪些商品被同時購買,項集就是商品的集合。
  • 支援度:頻繁項集的支援度通常用項集在輸入資料中出現的次數來計算。在啤機和尿布中就是啤酒喝尿布同時被人購買的次數。當然也可以用出現的概率來計算,這個就是出現的次數除上一個樣本總是。
  • 頻繁項集:支援度計數>min支援度計數的項集
  • 先驗性質:頻繁項集的所有非空子集都是頻繁的。這個性質是Aprori演算法關鍵的部分。要理解Apriori,首先要搞清楚這個性質的意思,至於為什麼成立時很簡單的邏輯。還如果購買啤酒的次數少於最小支援度,所有和啤酒一起購買的商品組合的次數不會高於啤酒的購買次數,所以任何和啤酒組合的商品不會是頻繁的。

虛擬碼

  • 輸入資料集D,min_support(最小支援度計數)
  • 遍歷D找到只有一個項的頻繁項集L1;
  • for(k=2;Lk-1!=空集;K++)
    {
    L.append(Lk-1);
    Ck=Apriori_Gen(Lk-1);                                  //利用頻繁Lk-1項集產生k項候選集Ck;
    遍歷資料集D,for each s in D; 產生s的所有k項子集;如果s的任一個k項子集cs在CK中;則cs.count++;
    LK=Ck中支援度計數大於min_support的項
    }
  • return Lk-1;
      Apriori_gen(Lk-1)這是一個產生候選頻繁項的函式,也算是Apriori的核心部分。      for each  l1 in Lk-1 for each l2 in Lk-1 if(l1 和 l2 只有一個元素不同)//實際應用的時候通常是沒有排序的,為了避免重複會增加一個判斷來避免重複。 c=l1 和l2 的交集;
                                if  c  不在cK中  ck.insert(c);   //為了提高效率這裡還可以增加一步來檢驗c的所有k-1項集是否在Lk-1中    return ck;

這其中沒有數學知識,只有一些邏輯和程式設計就能完成。最好是有集合運算的語言能很順利的完成。不用涉及太多的複雜資料結構。

  優化

 這個演算法在很大的資料量的時候應該是相對較慢的。書上寫了很多優化演算法的方法:

  1. 雜湊技術:這一點還沒怎麼看懂,先做個空白   ;
  2. 事務壓縮:如果某個樣本不包含任何的頻繁k-1項集,在產生k項集的時候可以不考慮此樣本;這樣需要遍歷的資料集會越來越小;
  3. 劃分:將資料集劃分為n個補充疊的集合。尋找每個集合的頻繁項。n個集合的頻繁項集的並集可作為D的候選頻繁項集;遍歷一次D選出滿足最小支援度的項;這中間有個全域性最小支援度和區域性最小支援度關係的計算。(區域性最小支援度計數=區域性樣本數/總樣本數)*全域性最小支援度計數。
  4. 抽樣
  5. 動態項集計數:還沒看懂,搞明白之後更新。
稍後會在後面貼上Python版本的程式碼。