關聯分析是從大量數據中發現項集之間相關聯繫,分析出如「因爲某些事件的發生而致使另一些事件的發生」之類的規則。web
關聯分析的一個典型例子是購物車分析。該過程經過發現用戶加入購物車中的不一樣商品之間的聯繫,分析用戶的購買習慣,瞭解哪些商品頻繁地被用戶同時購買。這種關聯關係的發現能夠幫助商家制定營銷策略,例如商品的促銷和擺放組合等。算法
FP-Growth算法是韓嘉煒等人提出的關聯分析算法。該個算法構建經過兩次數據掃描,將原始數據中的item壓縮到一個FP-tree(Frequent Pattern Tree,頻繁模式樹)上,接着經過FP-tree找出每一個item的條件模式基,最終獲得全部的頻繁項集。cdn
定義「TID」爲訂單ID,「Items bought」爲一次訂單內購買的商品,準備原始數據以下表所示。blog
TID | Items bought |
---|---|
100 | {f, a, c, d, g, i, m, p} |
200 | {a, b, c, f, l, m, o} |
300 | {b, f, h, j, o} |
400 | {b, c, k, s, p} |
500 | {a, f, c, e, l, p, m, n} |
在構建FP-Tree以前,首先要創建一張項頭表。掃描原始數據,並對每一個商品進行計數。在這裏能夠設置閾值,好比保留最少要出現三次的商品。篩選後剩下a,b,c,f,m,p這六個商品,將這些商品按數量降序排列,生成項頭表。排序
Item | Count |
---|---|
f | 4 |
c | 4 |
a | 3 |
b | 3 |
m | 3 |
p | 3 |
接下來開始第二次掃描原屬數據,對於每條數據,剔除非項頭表上的商品,並按照支持度降序排列。好比訂單100,購買商品爲{f, a, c, d, g, i, m, p},剔除數據後爲{f, a, c, m, p},排序後爲{f, c, a, m, p}。其餘的原始數據以此類推動行處理,獲得排序後的數據集。遞歸
TID | Items bought | (Ordered) frequent items |
---|---|---|
100 | {f, a, c, d, g, i, m, p} | {f, c, a, m, p} |
200 | {a, b, c, f, l, m, o} | {f, c, a, b, m} |
300 | {b, f, h, j, o} | {f, b} |
400 | {b, c, k, s, p} | {c, b, p} |
500 | {a, f, c, e, l, p, m, n} | {f, c, a, m, p} |
有了項頭表和篩選排序後的原始數據集,接下來就能夠構建FP-Tree了。創建FP-Tree須要咱們一條條的讀取篩選排序後的原始數據,並按照順序依次插入到樹中。若是有公共的祖先節點,則在對應的祖先節點加1。同時,新節點出現時,須要將其連接到項表頭對應的節點鏈表。直到全部數據都插入樹中,則構建完成。事件
接下來仍是用上面的數據舉個例子。首先插入TID 100,此時FP-Tree沒有其餘節點,所以{f, c, a, m, p}是一個獨立的路徑,全部節點計數爲1, 項頭表經過節點鏈表連接上對應的新增節點。部署
接着插入TID 200,{f, c, a, b, m},其中f、c、a三個節點公用,計數變爲2,到b節點產生新的分支,m爲b的子節點,兩個節點計數爲1。固然,對應的b、m兩個節點的鏈表也要更新。get
依次處理剩下的三條數據,構建完成FP-Treeit
準備好了FP-Tree,接下來就能夠開始挖掘頻繁項集。遍歷項頭表依次挖掘,找到每項的條件模式基。條件模式基是以要挖掘的節點做爲葉子節點所對應的子樹。獲得這個子樹,將子樹中每一個節點的的計數設置爲葉子節點的計數,並刪除計數低於約定值的節點。從這個條件模式基,咱們就能夠遞歸挖掘獲得頻繁項集了。
假設須要的最小節點計數爲2,開始挖掘p節點,以下圖所示
刪除圖中節點計數小於2的紅色{c:1}、{b:1}、{p:1}節點,獲得{p:2}節點的條件模式基爲{f:2, c:2, a:2, m:2}。經過它,能夠遞歸獲得頻繁二項集{f:2, p:2}、{c:2, p:2}、{a:2, p:2}、{m:2, p:2},頻繁三項集{f:2, c:2, p:2}、{f:2, a:2, p:2}等等,最後獲得最大的頻繁項集爲頻繁五項集,爲{f:2, c:2, a:2, m:2, p:2}。
若是最小節點計數爲1,則可在挖掘完上面的子樹後,根據項表頭對應的節點鏈表找到紅色的節點{p:1},繼續挖掘頻繁項集。
至此,p節點挖掘完畢,能夠繼續挖掘其餘節點。挖掘完全部節點,也就獲得了全部的頻繁項集。至於最後f節點,因爲它的條件模式基爲空,所以能夠不用去挖掘。
經過上面的介紹,能夠注意到在挖掘頻繁項集時,FP-Tree可能會很是大,遞歸獲得的頻繁項集也可能有指數多個。但同時也發現,每一個項頭表的商品對應的挖掘子樹,都是互相獨立的,也就是說能夠並行化挖掘頻繁集。所以,能夠單個商品構建一棵FP-Tree,也能夠幾個商品以小組的形式構建一棵FP-Tree。
回憶一下單機挖掘頻繁項集的步驟,能夠總結出可並行化執行的節點以下:
所以,能夠總結出並行挖掘頻繁集的步驟以下所示:
抄個算法放在這裏:
再抄個算法放在這裏:
最後抄一個算法放在這裏:
再講幾個能夠對算法結果進行干預的點吧。除了上面介紹算法時兩個能夠對數據進行篩選的節點,還能夠在算法前對原始數據進行處理,或者算法結束後對生成的頻繁項集進行處理。
一、首先能夠根據訂單裏商品出現的次數、訂單時間、日均銷量等信息設定權重值。並根據加權後的數據進行項頭表和FP-Tree的構建。
二、其次對於生成的頻繁結果集,能夠經過計算置信度和提高度對最終結果進行篩選。
最後,貼兩篇參考文章。