關聯分析是數據挖掘中常用的分析方法。一個常見的需求比如說尋找出經常一起出現的項目集合。
引入一個定義,項集的支持度(support),是指所有包含這個項集的集合在所有數據集中出現的比例。
規定一個最小支持度,那么不小於這個最小支持度的項集稱為頻繁項集(frequent item set)。
如何找到數據集中所有的頻繁項集呢?
最簡單的方法是對所有項集進行統計,可以通過逐漸增大項集大小的方式來遍歷所有項集。比如說下面的數據集,先統計所有單個元素集合的支持度,{z} 的支持度為5 (這里把項目出現次數作為支持度,方便描述),然后逐漸增大項集大小,比如{z,r} 的支持度為1
數據集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 |
顯然這樣的方式,計算量很大,當項目增多,項集的數目是指數增長的。當然我們也可以應用一些規律
1)如果一個項集是頻繁項集,那么它的子集都是頻繁項集
2)如果一個項集不是頻繁項集,那么它的超集也不是頻繁項集
Apriori算法就是應用了這些方法可以減少尋找頻繁項集的計算。而FP-Growth算法則另辟蹊徑,它在遍歷數據的時候構造一個樹結構,當樹構造完成,每個節點記錄的值就是這個節點到根節點路徑上的項集的支持度。
首先對數據集中的數據按單個元素的支持度進行重排
數據集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樹。把重排后每一行數據從左到右入樹。從空集開始,如果樹中已存在現有元素,則增加現有元素的值;如果現有元素不存在,則向樹添加一個分支。
樹構造完成后,以{x:3}這個節點為例,它表示了從這個節點到根節點路徑上集合{x,z}的支持度為3。
那么問題來了,我們如何保證我們能獲得所有的頻繁項集,即支持度大於最小支持度的項集。是找出節點值大於最小支持度就夠了嗎?比如設最小支持度為3,從樹上可以看出{z,x,y}的支持度為3,但是仔細觀察{z,x,y,t}這個項集的支持度也是為3,如何做呢?
首先為每個元素的找到所有前綴路徑,一條前綴路徑,是指元素父節點到根節點的路徑
單元素 | 前綴路徑 |
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 |
然后對每個元素的所有前綴路徑再執行一次FP樹的構造過程,這樣看到去除這個元素后能得到什么樣的頻繁項集。如下可以順利得出{z,x,y} + {t}是一個支持度為3的頻繁項集。
據此,FP-Growth方法就可以算出數據集中最小支持度為3的頻繁項集:{z},{z,x},{z,x,y},{z,x,y,t}
參考:
1. https://www.cnblogs.com/qwertWZ/p/4510857.html