機器學習實戰 - 讀書筆記(12) - 使用FP-growth算法來高效發現頻繁項集


[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樹的構建過程 Ø Ø Add {a,s,w} a:1 s:1 w:1 a:6 s:3 w:3 Ø a:2 s:2 w:1 Add {a,s} Ø a:3 s:2 w:1 Add {a,w} w:1 Header Table

最終的結果如下:(輸出的FP樹和頭指針表)

FP樹和Header Table的最終結果 Ø a:6 s:3 w:1 w:2 Header Table a:6 s:3 w:3

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實際上都不存在,因為不滿足最小支持度。
元素項w的FP樹和Header Table Ø a:3 s:1 Header Table a:3 s:1

參考

  • Machine Learning in Action by Peter Harrington


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM