[comment]: # 機器學習實戰 - 讀書筆記(12) - 使用FP-growth算法來高效發現頻繁項集
前言
最近在看Peter Harrington寫的“機器學習實戰”,這是我的學習心得,這次是第12章 - 使用FP-growth算法來高效發現頻繁項集。
基本概念
FP-growth算法 FP-growth算法的性能很好,只需要掃描兩次數據集,就能生成頻繁項集。但不能用於發現關聯規則。 我想應該可以使用Apriori算法發現關聯規則。 FP代表頻繁模式(Frequent Pattern)。
條件模式基(conditional pattern base)。 條件模式基是以所查找元素項為結尾的路徑集合。每一條路徑其實都是一條前綴路徑(prefix path)。 一條前綴路徑是介於所查找元素項與樹根節點之間的所有內容。
FP-growth算法 - 用途
- 快速生成頻繁項集
- 在一批有共性的文章中找到經常出現的匹配詞匯(共現詞),並進一步發現關聯規則。可以用於輸入自動補全功能。
- 發現數據中的共性。比如,可以找到,哪類用戶喜歡哪些文章。
核心算法解釋
FP-growth算法:生成頻繁項集
FP-growth算法 - Step 1:生成FP樹
輸入
- 數據集[數據,出現次數] 注:出現次數默認為1。在第二步的時候,會再次用到這個方法,這是出現次數就用其用途了。
- 最小支持度
輸出
- FP樹:FPTree
FPTree的根節點為項名為null的節點。
- 頭指針表: headerTable
Tree Node 的數據結構
- name : 項名
- count : 其路徑在數據集中出現的頻率
- nodeLink : 指向在FP樹下一個同項名的項。
- parent : 父節點
- children : 子節點
Header Table Item 的數據結構
- name : 項名
- count : 在數據集中出現的頻率
- nodeLink : 指向在FP樹第一個同項名的項。
邏輯過程
- 輸入
- sample 數據集
- 輸入
事務ID | 事務中的項集 |
---|---|
1 | 'a', 's', 'w', 'x' |
2 | 'a', 'd', 's' |
3 | 'a', 'w' |
4 | 'a', 'x' |
5 | 'a', 'd', 'w' |
6 | 'a', 'e', 's' |
-
-
- 最小支持度為3
- Step 1: 生成Header Table。
-
遍歷數據集,獲得每個元素項的出現頻率
去掉不滿足最小支持度的元素項。
結果如下:
元素項 | 出現頻率 ---------- | ------------ a | 6 s | 3 w | 3 注: 項d,e,x被去掉了,由於它們的出現頻率小於最小支持率3。
-
- Step 2: 生成FP Tree。
遍歷數據集,
對當前項集,去掉不在Header Table中的項。
對當前項集,按照在Header Table中出現頻率從大到小排序。
加入到FP Tree(), 並且對每項,更新Header Table Item或者Tree Node的NodeLink屬性。
去掉不在Header Table中的項的結果:
事務ID | 事務中的項集 | 過濾並排序后的項集 |
---|---|---|
1 | 'a', 's', 'w', 'x' | 'a', 's', 'w' |
2 | 'a', 'd', 's' | 'a', 's' |
3 | 'a', 'w' | 'a', 'w' |
4 | 'a', 'x' | 'a' |
5 | 'a', 'd', 'w' | 'a', 'w' |
6 | 'a', 'e', 's' | 'a' |
把處理過的項集加入 FP Tree 的過程:
按照路徑找,如果有count++,如果沒有增加一個節點,count=1
對新增加的節點,連接到上一個同項集或者header Table的項集的NodeLinker上。
示意圖如下:
最終的結果如下:(輸出的FP樹和頭指針表)
FP-growth算法 - Step 2:生成頻繁項集
- 輸入
- FP樹:PF Tree
- 頭指針表: header Table
- 最小支持度
- 前綴項集: 初始值為Empty List (輸出)
- 頻繁項集List: 初始值為Empty List (輸出)
- 輸出 無
- 邏輯過程
對Header Table的項,按照count從小到大排序
對Header Table的每一元素項:
把當前元素項加入到頻繁項集List中。(Header Table中的每個項都是滿足最小支持度的)
前綴項集 = 前綴項集 + 當前元素項。
找到已當前元素項的結尾的條件模式基(到根節點的所有路徑以及路徑的count)。
將條件模式基看成一個數據集(每個數據有一個count數),用生成FP Tree的方法,生成新的FP Tree和Header Table。
注:上一步過濾掉了不滿足最小支持度的子項集。(比如:對於元素項w,過濾掉了{s,a})
如果新的Header Table有數據:
使用生成頻繁項集的方法(也就是遞歸調用本方法)繼續生成(有n+1個元素項的)頻繁項集。
-
- 每個元素項的條件模式基
元素項 | 條件模式基 |
---|---|
a | :6 |
s | :3 |
w | {s,a}:1, :2 |
-
- 元素項w的FP樹和Header Table 注:元素項s和節點s實際上都不存在,因為不滿足最小支持度。
參考
- Machine Learning in Action by Peter Harrington