關聯分析算法:FP-Growth

關聯分析是從大量數據中發現項集之間相關聯繫,分析出如「因爲某些事件的發生而致使另一些事件的發生」之類的規則。web

關聯分析的一個典型例子是購物車分析。該過程經過發現用戶加入購物車中的不一樣商品之間的聯繫,分析用戶的購買習慣,瞭解哪些商品頻繁地被用戶同時購買。這種關聯關係的發現能夠幫助商家制定營銷策略,例如商品的促銷和擺放組合等。算法

FP-Growth算法是韓嘉煒等人提出的關聯分析算法。該個算法構建經過兩次數據掃描,將原始數據中的item壓縮到一個FP-tree(Frequent Pattern Tree,頻繁模式樹)上,接着經過FP-tree找出每一個item的條件模式基,最終獲得全部的頻繁項集。cdn

  • 優勢:簡單易上手,部署起來也很方便。
  • 缺點:須要有較多的數據,且效果通常。

一、FP-Growth

1.1 原始數據準備

定義「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}

1.2 創建項頭表

在構建FP-Tree以前,首先要創建一張項頭表。掃描原始數據,並對每一個商品進行計數。在這裏能夠設置閾值,好比保留最少要出現三次的商品。篩選後剩下a,b,c,f,m,p這六個商品,將這些商品按數量降序排列,生成項頭表。排序

Item Count
f 4
c 4
a 3
b 3
m 3
p 3

1.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}

1.4 構建FP-Tree

有了項頭表和篩選排序後的原始數據集,接下來就能夠構建FP-Tree了。創建FP-Tree須要咱們一條條的讀取篩選排序後的原始數據,並按照順序依次插入到樹中。若是有公共的祖先節點,則在對應的祖先節點加1。同時,新節點出現時,須要將其連接到項表頭對應的節點鏈表。直到全部數據都插入樹中,則構建完成。事件

接下來仍是用上面的數據舉個例子。首先插入TID 100,此時FP-Tree沒有其餘節點,所以{f, c, a, m, p}是一個獨立的路徑,全部節點計數爲1, 項頭表經過節點鏈表連接上對應的新增節點。部署

avatar

接着插入TID 200,{f, c, a, b, m},其中f、c、a三個節點公用,計數變爲2,到b節點產生新的分支,m爲b的子節點,兩個節點計數爲1。固然,對應的b、m兩個節點的鏈表也要更新。get

avatar

依次處理剩下的三條數據,構建完成FP-Treeit

avatar

1.5 挖掘頻繁項集

準備好了FP-Tree,接下來就能夠開始挖掘頻繁項集。遍歷項頭表依次挖掘,找到每項的條件模式基。條件模式基是以要挖掘的節點做爲葉子節點所對應的子樹。獲得這個子樹,將子樹中每一個節點的的計數設置爲葉子節點的計數,並刪除計數低於約定值的節點。從這個條件模式基,咱們就能夠遞歸挖掘獲得頻繁項集了。

假設須要的最小節點計數爲2,開始挖掘p節點,以下圖所示

avatar

刪除圖中節點計數小於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節點,因爲它的條件模式基爲空,所以能夠不用去挖掘。

二、PFP-Growth

經過上面的介紹,能夠注意到在挖掘頻繁項集時,FP-Tree可能會很是大,遞歸獲得的頻繁項集也可能有指數多個。但同時也發現,每一個項頭表的商品對應的挖掘子樹,都是互相獨立的,也就是說能夠並行化挖掘頻繁集。所以,能夠單個商品構建一棵FP-Tree,也能夠幾個商品以小組的形式構建一棵FP-Tree。

回憶一下單機挖掘頻繁項集的步驟,能夠總結出可並行化執行的節點以下:

  • 創建項頭表
  • 構建FP-Tree
  • 挖掘頻繁項集

所以,能夠總結出並行挖掘頻繁集的步驟以下所示:

  • 第一步,分割原始數據,根據分割的每片數據,並行化計數,生成項頭表。

抄個算法放在這裏:

avatar

  • 第二步,將項頭表的商品分組,對每一組進行單獨的頻繁項集挖掘。

再抄個算法放在這裏:

avatar

  • 第三步,將第二步的結果進行聚合總結。

最後抄一個算法放在這裏:

avatar

三、其餘

再講幾個能夠對算法結果進行干預的點吧。除了上面介紹算法時兩個能夠對數據進行篩選的節點,還能夠在算法前對原始數據進行處理,或者算法結束後對生成的頻繁項集進行處理。

一、首先能夠根據訂單裏商品出現的次數、訂單時間、日均銷量等信息設定權重值。並根據加權後的數據進行項頭表和FP-Tree的構建。

二、其次對於生成的頻繁結果集,能夠經過計算置信度和提高度對最終結果進行篩選。

  • 其中置信度計算規則,conf(X->Y) = P(Y|X) = P(X,Y)/P(X)。置信度越高,關聯性越強。
  • 提高度計算規則,lift(X->Y)=P(X,Y)/(P(X)P(Y)) = conf(X->Y)/P(Y)。關聯規則提高度大於1,爲有效;小於等於1,爲無效。特別的,當提高度等於1時,表示兩件事相互獨立,即一件事的發生,對於另外一件事的出現無影響。

最後,貼兩篇參考文章。

相關文章
相關標籤/搜索