1. 程式人生 > >【資料探勘】FPgrowth演算法筆記

【資料探勘】FPgrowth演算法筆記

1. 提出問題

對於Apriror演算法來說,仍然受到兩種非平凡開銷的影響:

  • 仍然需要產生大量的候選集。例如,如果有10^4個頻繁1項集,則需要產生10^7個候選頻繁2項集。

  • 可能需要重複地掃描整個資料庫。檢索資料庫中每個事務來確定候選項集支援度的開銷會很大。

所以,我們需要設計一種方法,挖掘全部頻繁項集而無須這種代價昂貴的候選產生過程。即,不需要產生如此大量的候選集,同時在確定候選集支援度時不需要重複地掃描整個資料庫。

這裡試圖解決這種問題的方法稱為頻繁模式增長(Frequent-Pattern Growth, FP-growth)

2. FP-growth

總的來說,就是在不生成候選項的情況下,完成Apriori演算法的功能。

FPTree演算法的基本資料結構,包含一個一棵FP樹和一個項頭表,每個項通過一個結點鏈指向它在樹中出現的位置。基本結構如下所示。需要注意的是項頭表需要按照支援度遞減排序,在FPTree中高支援度的節點只能是低支援度節點的祖先節點。

這裡寫圖片描述

另外還要交代一下FPTree演算法中幾個基本的概念:

  • FP-Tree:就是上面的那棵樹,是把事務資料表中的各個事務資料項按照支援度排序後,把每個事務中的資料項按降序依次插入到一棵以NULL為根結點的樹中,同時在每個結點處記錄該結點出現的支援度。

  • 條件模式基:包含FP-Tree中與字尾模式一起出現的字首路徑的集合。也就是同一個頻繁項在PF樹中的所有節點的祖先路徑的集合。比如I3在FP樹中一共出現了3次,其祖先路徑分別是{I2,I1:2(頻度為2)},{I2:2}和{I1:2}。這3個祖先路徑的集合就是頻繁項I3的條件模式基。

  • 條件樹:將條件模式基按照FP-Tree的構造原則形成的一個新的FP-Tree。比如上圖中I3的條件樹就是:
    這裡寫圖片描述

演算法的具體步驟:

Step 1)構造項頭表:掃描資料庫一遍,得到頻繁項的集合F和每個頻繁項的支援度。把F按支援度遞降排序,記為L。

Step 2)構造原始FPTree:把資料庫中每個事物的頻繁項按照L中的順序進行重排。並按照重排之後的順序把每個事物的每個頻繁項插入以null為根的FPTree中。如果插入時頻繁項節點已經存在了,則把該頻繁項節點支援度加1;如果該節點不存在,則建立支援度為1的節點,並把該節點連結到項頭表中。

Step 3)呼叫FP-growth(Tree,null)開始進行挖掘。虛擬碼如下:

procedure FP_growth(Tree, a)
if Tree 含單個路徑P then{
    for 路徑P中結點的每個組合(記作b)
    產生模式b U a,其支援度support = b 中結點的最小支援度;
} else {
    for each a i 在Tree的頭部(按照支援度由低到高順序進行掃描){
        產生一個模式b = a i U a,其支援度support = a i .support;
        構造b的條件模式基,然後構造b的條件FP-樹Treeb;
        if Treeb 不為空 then
            呼叫 FP_growth (Treeb, b);
    }
}

FP-growth是整個演算法的核心,再多囉嗦幾句。

FP-growth函式的輸入:tree是指原始的FPTree或者是某個模式的條件FPTree,a是指模式的字尾(在第一次呼叫時a=NULL,在之後的遞迴呼叫中a是模式字尾)

FP-growth函式的輸出:在遞迴呼叫過程中輸出所有的模式及其支援度(比如{I1,I2,I3}的支援度為2)。每一次呼叫FP_growth輸出結果的模式中一定包含FP_growth函式輸入的模式字尾。

我們來模擬一下FP-growth的執行過程。

  1. 在FP-growth遞迴呼叫的第一層,模式前後a=NULL,得到的其實就是頻繁1-項集。

  2. 對每一個頻繁1-項,進行遞迴呼叫FP-growth()獲得多元頻繁項集。

兩個例子來說明:

(1)

I5的條件模式基是(I2 I1:1), (I2 I1 I3:1),I5構造得到的條件FP-樹如下。然後遞迴呼叫FP-growth,模式字尾為I5。

這個條件FP-樹是單路徑的,在FP_growth中直接列舉{I2:2,I1:2,I3:1}的所有組合,之後和模式字尾I5取並集得到支援度>2的所有模式:{ I2 I5:2, I1 I5:2, I2 I1 I5:2}

這裡寫圖片描述

(2)

I5的情況是比較簡單的,因為I5對應的條件FP-樹是單路徑的,我們再來看一下稍微複雜一點的情況I3:

I3的條件模式基是{ {I2 I1:2}, {I2:2}, {I1:2} },所以生成的條件FP-樹如下圖1,然後遞迴呼叫FP-growth,模式字尾為I3。I3的條件FP-樹仍然是一個多路徑樹,把模式字尾I3和“條件FP-樹”中的“項頭表”中的每一項(即:I2和I1)取並集,得到一組模式{I2 I3:4, I1 I3:4}。

但是這一組模式不是字尾為I3的“所有的模式”,還需要遞迴呼叫FP-growth。

模式字尾為{I1,I3},可知{I1,I3}的條件模式基為{ {I2:2} },其生成的條件FP-樹如下圖2所示。這是一個單路徑的條件FP-樹,在FP_growth中把模式字尾{I1,I3}和“條件FP-樹”中的“項頭表”中的每一項(即:I2)取並集取並得到模式{I1 I2 I3:2}。

模式字尾為{I2,I3},因為{I2,I3}的條件模式基為空,遞迴呼叫結束。最終模式字尾I3的支援度>2的所有模式為:{I2 I3:4}, {I1 I3:4}, {I1 I2 I3:2}。

這裡寫圖片描述

這裡寫圖片描述

根據FP-growth演算法,最終得到的支援度>2頻繁模式如下:

這裡寫圖片描述

FP-growth演算法比Apriori演算法快一個數量級,在空間複雜度方面也比Apriori也有數量級級別的優化。但是對於海量資料,FP-growth的時空複雜度仍然很高,可以採用的改進方法包括資料庫劃分,資料取樣等等。