以前介紹的apriori算法中由於存在許多的缺陷,例如進行大量的全表掃描和計算量巨大的天然鏈接,因此如今幾乎已經再也不使用算法
在mahout的算法庫中使用的是PFP算法,該算法是FPGrowth算法的分佈式運行方式,其內部的算法結構和FPGrowth算法相差並非十分巨大分佈式
因此這裏首先介紹在單機內存中運行的FPGrowth算法指針
仍是使用apriori算法的購物車數據做爲例子,以下圖所示:排序
TID爲購物車項的編號,i1-i5爲商品的編號內存
FPGrowth算法的基本思想是,首先掃描整個購物車數據表,計算每一個商品的支持度,並從大到小從上往下排序,獲得以下表所示
數據挖掘
從底部最小支持度開始,逐一構建FP樹io
構建過程以下圖:class
最終構建出的FP樹以下圖im
將這個FP樹和支持度表關聯起來以下圖:技術
支持度表中的每一項都有一個存放指向FP樹中對應節點的指針,例如第一行指向i2:7;第二行指向i1:4,由於i1節點還出如今FP樹中的其餘位置,所謂i1:4節點中還存放着指向i1:2節點的指針
經過少數的全表掃描構建好的FP樹將購物車沒有規律的數據變成了一個有跡可循的樹形結構,而且省去了進行巨大的天然鏈接的運算
經過FP樹挖掘出關聯規則:
經過上圖的FP樹,咱們能夠根據每一個商品獲得該商品對應的條件模式基,條件FP樹和產生的頻繁模式
例如i5
在FP樹中能夠看到,從根節點到i5:1的路徑有兩條:
i2:7-->i1:4-->i5:1
i2:7-->i14-->i3:2-->i5:1
i2:7-->i1:4和i2:7-->i14-->i3:2就是i5的條件模式基,由於最終到達的節點確定是i5,因此將i5省略
記爲{i2,i1:1}{i2,i1,i3:1},爲何每一個條件模式基的計數爲1呢?雖然i2和i1的計數都很大,可是因爲i5的計數爲1,最終到達i5的重複次數也只能爲1。因此條件模式基的計數是根據路徑中節點的最小計數來決定的
根據條件模式基,咱們能夠獲得該商品的條件FP樹,例如i5:
根據條件FP樹,咱們能夠進行全排列組合,獲得挖掘出來的頻繁模式(這裏要將商品自己,如i5也算進去,每一個商品挖掘出來的頻繁模式必然包括這商品自己)
根據FP樹獲得的全表以下:
至此,FPGrowth算法輸出的結果就是產生的頻繁模式,FPGrowth算法使用的是分而治之的方式,將一顆可能十分巨大的樹形結構經過構構建條件FP子樹的方式分別處理
可是在商品數據十分巨大的狀況下,FPGrowth算法所構建的FP樹可能會大到計算機內存都沒法加載,這時就要使用分佈式的FPGrowth,PFP算法來進行計算
本文參考書:《數據挖掘概念與技術》