FP-growth演算法原理解析
FP-growth演算法(FP, Frequent Pattern)
FP-growth演算法只需要對資料庫進行兩次掃描。而Apriori演算法對於每個潛在的頻繁項集都會掃描資料集判定給定的模式是否頻繁,因此FP-growth演算法要比Apriori演算法快。
FP-growth演算法只需要掃描兩次資料集,第一遍對所有資料元素出現次數進行計數,第二遍只需考慮那些頻繁的元素。發現頻繁項集的基本過程分為兩步,構建FP樹和從FP樹中挖掘頻繁項集。
簡單來說,演算法的目的就是在多個出現的資料項中找到出現次數最多的資料項或者資料項集合,這裡的最多指的是出現次數大於等於給定的閾值(最小支援度)。找到單個數據項的次數較為簡單,只需要遍歷計數即可,但是對於資料項的組合即資料項集的出現次數較難確定,比如,某個資料項A與資料項B的出現次數都是頻繁的,但是他們的組合也就是說他們同時出現的次數卻不頻繁。資料集中出現較為頻繁的資料項組合我們成為頻繁項集,該頻繁項集的大小大於等於1。FP-growth演算法就是挖掘資料中的頻繁項集演算法中的一種。
在介紹FP-growth演算法之前先介紹一些概念。
- 資料探勘演算法中的資料是按照組(條)分的,一組資料是一個事務(這裡解釋不嚴謹,讀者就理解為資料是一條一條輸進演算法裡的,每條資料中包含一些資料項,一條資料就是一個事務)。
- FP樹,FP樹是FP-growth演算法中構建的樹形資料結構,用於組織資料。該樹中每個葉結點到根節點的路徑中所有資料項就是與該葉結點同時出現的資料們,不同葉結點到根節點的路徑中共同的部分是大家共同的資料。
- CPB(Conditional pattern base)條件模式基,CPB是指FP樹中葉結點到根節點這條路徑中,不包含跟結點和葉結點的其他所有資料的集合(或者說是這些結點組成的路徑,即字首路徑)。演算法會對每個頻繁項用其所有的CPB構建條件FP樹
FP-growth演算法執行過程
對於FP-growth演算法的介紹,本文打算通過一個例子來解釋。
假設某個超市想通過分析使用者的購買習慣來改變進貨數量以實現獲利最大化。現在給出了某天的購物記錄,為了理解方便假設所有商品的每個使用者只買了一件,也就是對於一條交易記錄只在乎商品的種類,數量不予考慮。再者,為了方便書寫這裡把商品名用字母表示。
記錄ID | 記錄中的商品名 |
001 | r,z,h,j,p |
002 | z,y,x,w,v,u,t,s |
003 | z |
004 | r,x,n,o,s |
005 | y,r,x,z,q,t,p |
006 | y,z,x,e,q,s,t,m |
- 遍歷資料集,統計所有元素出現次數
r | z | h | j | p | y | x | w | v | u | t | s | n | o | q | e | m |
3 | 5 | 1 | 1 | 2 | 3 | 4 | 1 | 1 | 1 | 3 | 3 | 1 | 1 | 2 | 1 | 1 |
此處設定最小支援度為3,也就是所出現次數大於等於3的即為頻繁。在構建FP樹時,為了使各個事務(記錄)的公共部分在同一路徑上,因此建立樹時,各個事務應該一定順序排列,此處按照商品出現次數的倒序排序。所以經過篩選得
記錄ID | 記錄中的商品名 | 篩選且排序後的商品 |
001 | r,z,h,j,p | z,r |
002 | z,y,x,w,v,u,t,s | z,x,y,s,t |
003 | z | z |
004 | r,x,n,o,s | x,s,r |
005 | y,r,x,z,q,t,p | z,x,y,r,t |
006 | y,z,x,e,q,s,t,m | z,x,y,s,t |
- 構建FP樹
FP樹的根節點是空結點,逐條將排序篩選後的記錄插入樹中。如果記錄中的結點在樹的該路徑中有則該結點計數加一,否則分支。
- 初始時,FP樹只有一個結點即∅
- 將{z,r}記錄插入後得
- 將{z,x,y,s,t}記錄插入後得
- 將{z}將入
- 將{x,s,r}
- 將{z,x,y,r,t}
- 將{z,x,y,s,t}
此時FP樹已經構建的差不多了,為了在找頻繁項集時方便找到樹中相同的資料,需要把相同的資料項連線起來(結點連結)
- 從FP樹中挖掘頻繁項集
建立了FP樹之後,就可以抽取頻繁項集了。與Apriori演算法類似,首先從單個元素集合開始,然後在此基礎上逐步構建更大的集合。FP-growth演算法中的頻繁項集是遞迴挖掘的,其過程簡單解釋就是在集合中每次加入一個新元素a後得頻繁項集S,在此基礎上繼續建立a的條件FP樹把對應不滿足的元素刪除得到對應的頭表H,然後在以此遞迴建立H中所有元素的條件FP樹得其頭表,直到某遞迴層H為空。有些複雜,具體看示例演示過程。
首先,查詢每個頻繁項的條件模式基
頻繁項 | 條件模式基 |
z | {}5 |
r | {x, s}1, {z, x, y}1, {z}1 |
x | {z}3, {}1 |
y | {z, x}3 |
s | {z, x, y}2, {x}1 |
t | {z, x, y, s}2, {z, x, y, r}1 |
找到所有頻繁項的CPB後就是建立條件FP樹,遞迴的挖掘頻繁項集。
計算過程如下:
找到所有元素的CPB之後(程式設計時不用把所有元素CPB都找出再進行下一步,直接遞迴操作),建立對應的條件FP樹,將各個CPB中的元素的出現次數進行統計,剔除不滿足最小支援度的集合,得到的就是該元素對應條件FP樹。比如對於元素t,經過計數後得{z:3, x:3, y:3, s:2, r:1}。將s與r剔除因為不滿足最小支援度3。對應的含義是{t, s}, {t, r}兩個項集不頻繁,注意此處元素t是頻繁的,但是與s,r的組合不頻繁。
頻繁項 | 篩選後的條件模式基 |
z | {}5 |
r | {}0 |
x | {z}3, {}1 |
y | {z, x}3 |
s | {x}2,{x}1 |
t | {z, x, y,}3 |
然後開始建立頻繁項集。頻繁項集的產生過程其實就是不斷組合元素得到不同長度的集合,找到出現頻數高的集合。接下來對每個元素分別建立包含它們且長度不同的集合。我們為了方便介紹將各個元素條件FP樹產生的頭指標表記為H。
這裡挑選元素的順序是按照每個條件FP樹中頻繁項頻數的逆序選擇的。
- 對於z來說,z本身是頻繁的,所以包含單個元素的項集頻繁即{z},又因為H為空所以最終Z的頻繁項集為{z}
- 對於r來說,r本身是頻繁的,所以包含單個元素的項集頻繁即{r},又因為H為空所以最終r的頻繁項集為{r}
- 對於x來說,x本身是頻繁的,所以包含單個元素的項集頻繁即{x},又因為H為{{z}3, {}},對應的條件FP樹如圖
所以x與z的組合頻繁,而z的H為空,也就是z對應的條件FP樹為空,所以含x的頻繁項集為{{x},{x,z}}
4. 對於y來說,y本身是頻繁的,所以包含單個元素的項集頻繁即{y},又因為H為{{z, x}3},對應的條件FP樹如圖
所以z與y組合的集合頻繁。而z的H為空即z的條件FP樹為空,所以y與z的組合只有{y, z}。
而y與x的組合也頻繁,所以{y,x}頻繁,然後x的條件FP樹如左圖。注意此處,x的條件FP樹是在y的FP樹的基礎上建立的,也就是說,該條件FP樹中與x頻繁的元素也與y頻繁,因為該元素也出現在y的FP樹中。x的H包含z,z的FP樹為空,所以不在遞迴下去,故{y,x,z}也頻繁。所以包含y的頻繁項集為{{y},{y, z},{y,x,z},{y,x}}。
5. 對於s來說,s本身是頻繁的,所以包含單個元素的項集頻繁即{s},又因為H為{{x}2,{x}1},條件FP樹為
同理{s,x}頻繁,將x加入後繼續生成x的條件FP樹為空,不在繼續尋找。得包含s的頻繁項集為{{s}, {s,x}}
6. 對於t來說,t本身是頻繁的,所以包含單個元素的項集頻繁即{t},又因為H為{{z, x, y,}3},條件FP樹為
然後,將z加入集合{t},z的條件FP樹為空不在繼續遍歷得頻繁項集{t,z}。
然後,將x加入集合{t},因為x的條件FP 樹為下圖,故在{t,x}中加入z得
{t,x,z},由於z的條件FP樹為空,不在繼續遍歷。故此次過程得到的頻繁項集為{{t,x},{t,x,z}}。
然後,將y加入集合{t},y對應的條件FP樹為下圖,故在{t,y}中加入z,由於z的條件FP樹為空,不在繼續遍歷。得{t,y,z}。故此次遞迴得到的頻繁項集為{{t,y,z},{t,y}}
然後,將x加入{t,y},生成x的條件FP樹為左圖,故在{t,y,x}中加入z得{t,y,x,z}。由於z的條件FP樹為空,不在繼續遍歷。故此次遞迴得到的頻繁項集為
{{t,y,x,z},{t,y,x} }
最終結果為
頻繁項 | 頻繁項集 |
z | {z} |
r | {r} |
x | {{x},{x,z}} |
y | {{y},{y, z},{y,x,z},{y,x}} |
s | {{s},{s,x}} |
t | {{t},{t,z},{t,x,z},{t,x},{t,y,z},{t,y,x,z},{ t,y,x },{ t,y}} |
總結一下過程,對於每個元素a的FP樹的H中的每個元素b都與a的組合頻繁,而在a元素對應的H中,有與b頻繁的元素c,那麼{a,b,c}也頻繁。同理可以處理c及其他元素。之所以可以這樣做是應為元素a與其對應的H中的所有元素都頻繁出現,而在該H中,b又與c頻繁出現,c在該H中,所以a,b,c頻繁。每一個元素對應不同的H,每一次遞迴時,對應的頻繁項集的長度就會增加,H範圍會在上一遞迴層H_old的範圍的基礎上縮小。
如果上面的過程沒懂,下面手寫推到一遍方便理解
Refenence
J.Han, J.Pei, Y.Yin, R.Mao, “Mining Frequent Patterns without Candidate Generations: A Frequent-Pattern Tree Approach,” Data Mining and Knowledge Discovery 8 (2004), 53-87
《機器學習實戰》