關聯分析(一)--FP-Growth演算法
轉自:https://www.cnblogs.com/datahunter/p/3903413.html
關聯分析又稱關聯挖掘,就是在交易資料、關係資料或其他資訊載體中,查詢存在於專案集合或物件集合之間的頻繁模式、關聯、相關性或因果結構。關聯分析的一個典型例子是購物籃分析。通過發現顧客放入購物籃中不同商品之間的聯絡,分析顧客的購買習慣。比如,67%的顧客在購買尿布的同時也會購買啤酒。通過了解哪些商品頻繁地被顧客同時購買,可以幫助零售商制定營銷策略。關聯分析也可以應用於其他領域,如生物資訊學、醫療診斷、網頁挖掘和科學資料分析等。
1. 問題定義
圖1 購物籃資料的二元表示
圖1表示顧客的購物籃資料,其中每一行是每位顧客的購物記錄,對應一個事務,而每一列對應一個項。令I={i1, i2, ... , id}是購物籃資料中所有項的集合,而T={t1, t2, ... , tN}是所有事務的集合。每個事務ti包含的項集都是I的子集。在關聯分析中,包含0個或多個項的集合被稱為項集(itemset)。所謂的關聯規則是指形如X→Y的表示式,其中X和Y是不相交的項集。在關聯分析中,有兩個重要的概念——支援度
公式1
其中,N是事務的總數。關聯規則的支援度很低,說明該規則只是偶然出現,沒有多大意義。另一方面,置信度可以度量通過關聯規則進行推理的可靠性。因此,大多數關聯分析演算法採用的策略是:
(1)頻繁項集產生:其目標是發現滿足最小支援度閾值的所有項集,這些項集稱作頻繁項集。
(2)規則的產生:其目標是從上一步發現的頻繁項集中提取所有高置信度的規則,這些規則稱作強規則。
2. 構建FP-tree
FP-growth演算法通過構建FP-tree來壓縮事務資料庫中的資訊,從而更加有效地產生頻繁項集。FP-tree其實是一棵字首樹,按支援度降序排列,支援度越高的頻繁項離根節點越近,從而使得更多的頻繁項可以共享字首。
圖2 事務型資料庫
圖2表示用於購物籃分析的事務型資料庫。其中,a,b,...,p分別表示客戶購買的物品。首先,對該事務型資料庫進行一次掃描,計算每一行記錄中各種物品的支援度,然後按照支援度降序排列,僅保留頻繁項集,剔除那些低於支援度閾值的項,這裡支援度閾值取3,從而得到<(f:4),(c:4),(a:3),(b:3),(m:3,(p:3)>(由於支援度計算公式中的N是不變的,所以僅需要比較公式中的分子)。圖2中的第3列展示了排序後的結果。
FP-tree的根節點為null,不表示任何項。接下來,對事務型資料庫進行第二次掃描,從而開始構建FP-tree:
第一條記錄<f,c,a,m,p>對應於FP-tree中的第一條分支<(f:1),(c:1),(a:1),(m:1),(p:1)>:
圖3 第一條記錄
由於第二條記錄<f,c,a,b,m>與第一條記錄有相同的字首<f,c,a>,因此<f,c,a>的支援度分別加一,同時在(a:2)節點下新增節點(b:1),(m:1)。所以,FP-tree中的第二條分支是<(f:2),(c:2),(a:2),(h:1),(m:1)>:
圖4 第二條記錄
第三條記錄<f,b>與前兩條記錄相比,只有一個共同字首<f>,因此,只需要在(f:3)下新增節點<b:1>:
圖5 第三條記錄
第四條記錄<c,b,p>與之前所有記錄都沒有共同字首,因此在根節點下新增節點(c:1),(b:1),(p:1):
圖6 第四條記錄
類似地,將第五條記錄<f,c,a,m,p>作為FP-tree的一個分支,更新相關節點的支援度:
圖7 第五條記錄
為了便於對整棵樹進行遍歷,建立一張項的頭表(an item header table)。這張表的第一列是按照降序排列的頻繁項。第二列是指向該頻繁項在FP-tree中節點位置的指標。FP-tree中每一個節點還有一個指標,用於指向相同名稱的節點:
圖8 FP-tree
3. 從FP-tree中挖掘頻繁模式(Frequent Patterns)
我們從頭表的底部開始挖掘FP-tree中的頻繁模式。在FP-tree中以p結尾的節點鏈共有兩條,分別是<(f:4),(c:3),(a:3),(m:2),(p:2)>和<(c:1),(b:1),(p:1)>。其中,第一條節點連結串列表示客戶購買的物品清單<f,c,a,m,p>在資料庫中共出現了兩次。需要注意到是,儘管<f,c,a>在第一條節點鏈中出現了3次,單個物品<f>出現了4次,但是它們與p一起出現只有2次,所以在條件FP-tree中將<(f:4),(c:3),(a:3),(m:2),(p:2)>記為<(f:2),(c:2),(a:2),(m:2),(p:2)>。同理,第二條節點連結串列示客戶購買的物品清單<c,b,p>在資料庫中只出現了一次。我們將p的字首節點鏈<(f:2),(c:2),(a:2),(m:2)>和<(c:1),(b:1)>稱為p的條件模式基(conditional pattern base)。我們將p的條件模式基作為新的事務資料庫,每一行儲存p的一個字首節點鏈,根據第二節中構建FP-tree的過程,計算每一行記錄中各種物品的支援度,然後按照支援度降序排列,僅保留頻繁項集,剔除那些低於支援度閾值的項,建立一棵新的FP-tree,這棵樹被稱之為p的條件FP-tree:
圖9 p的條件FP-tree
從圖9可以看到p的條件FP-tree中滿足支援度閾值的只剩下一個節點(c:3),所以以p結尾的頻繁項集有(p:3),(cp:3)。由於c的條件模式基為空,所以不需要構建c的條件FP-tree。
在FP-tree中以m結尾的節點鏈共有兩條,分別是<(f:4),(c:3),(a:3),(m:2)>和<(f:4),(c:3),(a:3),(b:1),(m:1)>。所以m的條件模式基是<(f:2),(c:2),(a:2)>和<(f:1),(c:1),(a:1),(b:1)>。我們將m的條件模式基作為新的事務資料庫,每一行儲存m的一個字首節點鏈,計算每一行記錄中各種物品的支援度,然後按照支援度降序排列,僅保留頻繁項集,剔除那些低於支援度閾值的項,建立m的條件FP-tree:
圖10 m的條件FP-tree
與p不同,m的條件FP-tree中有3個節點,所以需要多次遞迴地挖掘頻繁項集mine(<(f:3),(c:3),(a:3)|(m:3)>)。按照<(a:3),(c:3),(f:3)>的順序遞迴呼叫mine(<(f:3),(c:3)|a,m>),mine(<(f:3)|c,m>),mine(null|f,m)。由於(m:3)滿足支援度閾值要求,所以以m結尾的頻繁項集有{(m:3)}。
圖11 節點(a,m)的條件FP-tree
從圖11可以看出,節點(a,m)的條件FP-tree有2個節點,需要進一步遞迴呼叫mine(<(f:3)|c,a,m>)和mine(<null|f,a,m>)。進一步遞迴mine(<(f:3)|c,a,m>)生成mine(<null|f,c,a,m>)。因此,以(a,m)結尾的頻繁項集有{(am:3),(fam:3),(cam:3),(fcam:3)}。
圖 12 節點(c,m)的條件FP-tree
從圖12可以看出,節點(c,m)的條件FP-tree只有1個節點,所以只需要遞迴呼叫mine(<null|f,c,m>)。因此,以(c,m)結尾的頻繁項集有{(cm:3),(fcm:3)}。同理,以(f,m)結尾的頻繁項集有{(fm:3)}。
在FP-tree中以b結尾的節點鏈共有三條,分別是<(f:4),(c:3),(a:3),(b:1)>,<(f:4),(b:1)>和<(c:1),(b:1)>。由於節點b的條件模式基<(f:1),(c:1),(a:1)>,<(f:1)>和<(c:1)>都不滿足支援度閾值,所以不需要再遞迴。因此,以b結尾的頻繁項集只有(b:3)。
同理可得,以a結尾的頻繁項集{(fa:3),(ca:3),(fca:3),(a:3)},以c結尾的頻繁項集{(fc:3),(c:4)},以f結尾的頻繁項集{(f:4)}。
5. 討論
在韓家煒教授提出FP-growth演算法之前,關聯分析普遍採用Apriori及其變形演算法。但是,Apriori及其變形演算法需要多次掃描資料庫,並需要生成指數級的候選項集,效能並不理想。FP-growth演算法提出利用了高效的資料結構FP-tree,不再需要多次掃描資料庫,同時也不再需要生成大量的候選項。
對於單路徑的FP-tree其實不需要遞迴,通過排列組合可以直接生成。韓家煒教授在其論文中提到了針對單路徑的優化演算法。論文中也提到了面對大資料時,如何調整FP-growth演算法使之適應資料量。
6. 參考資料
[1] Mining Frequent Patterns without Candidate Generation. Jiawei Han, Jian Pei, and Yiwen Yin. Data Mining and Knowledge Discovery. Volume 8 Issue 1. January 2004. [PDF]
[2] Frequent Pattern 挖掘之二(FP Growth演算法). yfx416. Software Engineer in NRC. 2011. [Link]
[3] FP-Tree演算法的實現. Orisun. 華夏35度. 2011. [Link]