關聯分析(一)--FP-Growth演算法

Eason.wxd發表於2018-12-28

轉自: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是不相交的項集。在關聯分析中,有兩個重要的概念——支援度(support)和置信度(confidence)。支援度確定規則可以用於給定資料集的頻繁程度,而置信度確定Y在包含X的事務中出現的頻繁程度。支援度(s)和置信度(c)這兩種度量的形式定義如下:

公式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]

相關文章