1. 程式人生 > >Apriori和FPgrowth演算法學習

Apriori和FPgrowth演算法學習

這兩天看了這兩個演算法,主要來源是機器學習實戰。

1.Apriori演算法

首先是兩個定義

項集的支援度,定義為資料集中包含該項集的記錄所佔的比例。比如對於一個單獨的item,那麼item的支援度為item出現的資料集比上總的資料集,這裡注意如果一個數據條目中重複出現一個item多次,那麼提取資料時只計算為1次,也就是我們並不關心某人買了兩件商品0以及兩件商品2的情況,只關心購買了商品0和商品2。

可信度(置信度),指規則的支援度,如{麵包->牛奶}這條規則,為{麵包,牛奶}的支援度比上{麵包}的支援度

演算法的主要原理:

如果一個項集是頻繁的,那麼他的子項集一定是頻繁的,不如{0,1}這個項集出現100次,那麼0和1也一定至少出現過100次。也就是說在演算法執行過程中,如果我們知道

一個子項集的支援度小於閾值,那麼就不用為這個子項集生成更大的項集了。如一旦計算出項集{2,3}的支援度小於閾值,那麼就不用再計算{1,2,3}這樣的項集了。

具體程式碼可參見教材。

程式碼中一個優化的地方是,利用兩個k大小的子項集生成k+1項集時,只比較子項集的前k-1項,若這k-1項相同,那麼就可以合併為一個k+1項集。比如,利用{1,3} ,{2,3}{3,5},{2,5}這幾個項集生成3大小的項集時,可以只比較第一個,那麼可以生成的項集為{2,3,5}。 原因是若一個k+1項集是頻繁的,比如是{a1,a2,...a(k+1)}那麼他必有兩個子項集為{a1,a2,...a(k-1),ak}和{a1,a2,...a(k-1),a(k+1)}

2.FPgrowth演算法

基本原理和Apriori相同,只不過在訓練過程中採用了FP樹,速度上會優於Apriori演算法,在運用這個演算法的過程中,我涉及到的資料集中有7851個item(大於閾值的估計有5000左右),最後生成的FreqList有300w條,演算法執行時間在半小時左右,感覺速度上還可以滿足要求。雖然最後發現的pattern不是很滿意,進一步優化中。