FP增長算法(FP Growth Algorithm)

0 問題描述

給定事務集TS (Transaction Set), 項全集IUS (Item Universal Set)以及支持度閾值s0 , 求所有支持度大於s0 的項集, 即頻繁項集.

TS 給定以後, 任意項集的支持度s 和它在事務集中出現的頻數f 是等價的:

f=s|TS|
因此爲了方便敘述, 我使用”支持度”同時代表”項在事務集中出現的頻數”以及”項在事務集中出現的頻數與事務集大小之比”, 具體代表哪個含義, 可以根據上下文輕易區分.

1 記號

我們知道FP樹是一棵前綴樹, 樹上每個節點關聯一個項. 設iIUS 是一個項, fp 表示一棵FP樹, 爲方便敘述, 我引進以下符號:

  • nodesi : FP樹上與項i 相關聯的節點的集合, 注意這樣的節點可能有多個, 因此nodei 表示一類節點而不是FP樹上特定的某個節點
  • fp .root : fp 的根節點, 在前綴樹的通常實現方式裏, 根節點不關聯任何項
  • fp .headers : FP增長算法需要遍歷一棵FP樹上的所有關聯到同一個項的節點, 因此我們使用一個鏈表將nodesi 中的元素串聯在一起.這樣, 每個nodesi 關聯一個鏈表, 所有這些鏈表的頭存儲在fp .headers

我們說項是有大小的, 項的大小等於其支持度,, 因此項集是可以排序的. 對於已經排序的項集, 我們說”項集的最後一個元素”是指”項集中最小的項, 即項集中支持度最小的項.

2 從事務集構造一顆FP樹

我們假設用於構造FP樹的事務集爲ts , 項全集爲ius . FP增長算法的第一步是從ts , ius 構造一顆FP樹fp , 然後刪掉樹上所有支持度小於s0 的單項. 這個過程同時會構造出fp .heders .

首先, 在算法開始的時候, ius 中項的大小是未知的. 爲了明確每個項的大小, 我們掃描事務集ts , 記錄每個單項i 的支持度si . 這個過程結束後, 我們就可以將每個事務的項集按照項的大小降序排序.

然後, 我們開始更新項全集ius , 刪除ius 中所有支持度小於s0 的項, 我們將更新後的項全集記爲ius . 我們將利用ius 構造fp .

最後, 爲了儘可能地壓縮前綴樹, 我們讓支持度最高的節點出現在樹的根部, 支持度最低的節點則出現在樹梢. 具體地, 對於每個tts , 我們順序掃描其項集, 並依次將掃描到的每個項iius 插入到fp 上. 在掃描過程中我們始終忽略不屬於ius 中的項. 注意, 對於每個新插入的節點node , 我們都要相應地更新fp .headers 表.

我們構造的FP樹符合以下兩個性質:

  • 性質1: 樹上每個節點對應的單項都是頻繁的.
    這是顯然的, 因爲不頻繁的單項不會出現在ius 中, 而不出現在ius 中的項不會被插入到fp 上.

  • 性質2: 對於從根到樹上任意節點的路徑, 路徑上不會有相同節點, 按照從根開始的方向,各個節點的支持度是單調不增的.
    由於從根到任意節點的路徑都來自於一個事務項集或其子集, 所以絕不會有相同的節點.另一方面, 對於一個特定的事務項集, 其支持度大的項總是被我們首先掃描並插入, 並且後插入的項總是連接到新插入的項, 因此路徑上支持度是單調不增的.

由於性質2, 我們可以把FP樹上從根開始的任意路徑視爲一個集合, 並由此得到額外的結論:

  • 性質3: 對於從根到任意節點的路徑, 路徑的任意子集的支持度等與子集中最後一個項的支持度.

3 從簡單的FP樹生成頻繁項集

在以下兩種情況下, 算法無需遞歸, 直接返回結果:

  1. fp 爲空
  2. fp 只有一個樹葉

對於情況1, 直接返回空集.

情況2稍微複雜一些, fp 只有一個樹葉, 此時樹退化爲一條從樹根到其唯一樹葉的鏈表.鏈表上的所有元素構成一個集合S , 由FP樹的性質3和性質1可知, S 的任意子集都是頻繁項集, 因此, 算法返回S 的冪集.

FP增長過程是一個遞歸過程, 因此以上兩種情況被視爲遞歸地基本解.

4 從複雜的FP樹生成頻繁項集

在最一般的情況下, fp 有多個分支.此時, 算法爲每個(頻繁)單項i 生成一顆FP樹, 稱爲該頻繁單項的條件FP樹, 記爲CFPi , 然後遞歸求解每棵CFPi 上的頻繁項集, 最後合併所有返回結果, 生成並返回fp 上的所有頻繁項集.

這種情況具體分三步執行.

第一步: 生成條件樣式基

首先, 對於fp 上的每個(頻繁)單項i , 我們找到nodesi , 遍歷nodesi 中的每個節點node , 並沿其父指針上溯, 生成(複製)一條前綴路徑(注意,所有前綴路經均不包含node 本身), 將這條複製出的路徑存入該單項的條件樣式基CPBi (Conditional Pattern Base of i )中, 同時, 該路徑上每個節點(單項)的支持度減少爲該單項的支持度.

第二步: 生成條件事務集

i 的條件樣式基PCBi 生成i 的事務集tsi 的規則如下:

  1. PCBi 中的每個前綴路徑對應一組事務, 該組中的所有事務具有相同的項集
  2. 每組事務的頻繁項集由該組事務對應的前綴路徑上的所有節點(對應的項)組成
  3. 每組事務中事務的個數是該組事務對應的前綴路徑上支持度最低的節點的支持度

我們可以利用上述規則容易地生成對應每個項的事務集.

第三步: 生成頻繁項集

設有項集X , 且XCFPi 上的支持度爲s1 , 並且出現在CFPi 中的事務的集合A={t1,t2,...,ts1} 的每個事務中.現在向A 中的每個項集添加項i 生成新的事務集合A=t1,t2,...,ts1 , 我們知道A 必是FP 上的事務構成的集合.

Y=Xi , 我們有以下兩個結論:

  1. tA,Yt
  2. tAti,Yt

第一個結論是顯然的.

對於第二個結論, 設ti 結尾, 並且tA ,
Yt ,
則必有(Yi)(ti) .
由於第一步的工作, 我們有這樣的事實:CFPi 中的事務是由FP 上所有以i 結尾的事務去掉i 後生成的
所以(ti)CFPi 上的事務
又因爲(Yi)(ti)(Yi)=X
所以(ti)A
所以tA .
這與我們的假設矛盾, 因此結論2也是正確的.

對於CPFi 中的每個項集X , 設XCPFi 中的支持度爲s1 ; 現在向X 中添加項i , 並設XFP 上的支持度爲s2 . 由結論1可以知道σFP(Y)σCFPi(X) , 由於YFP 上以i 結尾的項集, 結合結論2可以知道, 不存在FP 上的事務t , 使得 tAYt . 於是, 我們有s1=s2 .

這樣, 對於CFPi 上的任意頻繁項集X , Y=XiFP 上以i 結尾的頻繁項集, 另一方面, 若YFP 上以i 結尾的頻繁項集, 則必有X=Yi , 且XCFPi 上的頻繁項集.

於是我們可以通過在CFPi 上的所有頻繁項集X 中添加i , 形成FP 上所有以i 結尾的頻繁項集Y=Xi .

這樣, 我們就可以構造FP 上以任意單項i 結尾的頻繁項集, 合併這些項集, 就可以得到FP 上的所有頻繁項集.

參考

  1. https://github.com/integeruser/FP-growth
  2. <數據挖掘導論>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章