關聯挖掘算法Apriori和FP-Tree學習

Apriori算法和FPTree算法都是數據挖掘中的關聯規則挖掘算法,處理的都是最簡單的單層單維布爾關聯規則。mysql

Apriori算法算法

Apriori算法是一種最有影響的挖掘布爾關聯規則頻繁項集的算法。是基於這樣的事實:算法使用頻繁項集性質的先驗知識。Apriori使用一種稱做逐層搜索的迭代方法,k-項集用於探索(k+1)-項集。首先,找出頻繁1-項集的集合。該集合記做L1。L1用於找頻繁2-項集的集合L2,而L2用於找L3,如此下去,直到不能找到頻繁k-項集。找每一個Lk須要一次數據庫掃描。sql

這個算法的思路,簡單的說就是若是集合I不是頻繁項集,那麼全部包含集合I的更大的集合也不多是頻繁項集。數據庫

算法原始數據以下:數據結構

TID函數

List of item_ID’s優化

T100spa

T200.net

T300排序

T400

T500

T600

T700

T800

T900

I1,I2,I5

I2,I4

I2,I3

I1,I2,I4

I1,I3

I2,I3

I1,I3

I1,I2,I3,I5

I1,I2,I3

算法的基本過程以下圖:

image

首先掃描全部事務,獲得1-項集C1,根據支持度要求濾去不知足條件項集,獲得頻繁1-項集。

下面進行遞歸運算:

已知頻繁k-項集(頻繁1-項集已知),根據頻繁k-項集中的項,鏈接獲得全部可能的K+1_項,並進行剪枝(若是該k+1_項集的全部k項子集不都能知足支持度條件,那麼該k+1_項集被剪掉),獲得clip_image002項集,而後濾去該clip_image002[1]項集中不知足支持度條件的項獲得頻繁k+1-項集。若是獲得的clip_image002[2]項集爲空,則算法結束。

鏈接的方法:假設clip_image004項集中的全部項都是按照相同的順序排列的,那麼若是clip_image004[1][i]和clip_image004[2][j]中的前k-1項都是徹底相同的,而第k項不一樣,則clip_image004[3][i]和clip_image004[4][j]是可鏈接的。好比clip_image006中的{I1,I2}和{I1,I3}就是可鏈接的,鏈接以後獲得{I1,I2,I3},可是{I1,I2}和{I2,I3}是不可鏈接的,不然將致使項集中出現重複項。

關於剪枝再舉例說明一下,如在由clip_image006[1]生成clip_image008的過程當中,列舉獲得的3_項集包括{I1,I2,I3},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5},可是因爲{I3,I4}和{I4,I5}沒有出如今clip_image006[2]中,因此{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}被剪枝掉了。

海量數據下,Apriori算法的時空複雜度都不容忽視。

空間複雜度:若是clip_image010數量達到clip_image012的量級,那麼clip_image014中的候選項將達到clip_image016的量級。

時間複雜度:每計算一次clip_image018就須要掃描一遍數據庫。

FP-Tree算法

FPTree算法:在不生成候選項的狀況下,完成Apriori算法的功能。

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

image

另外還要交代一下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的條件樹就是:

image

 

一、 構造項頭表:掃描數據庫一遍,獲得頻繁項的集合F和每一個頻繁項的支持度。把F按支持度遞降排序,記爲L。

二、 構造原始FPTree:把數據庫中每一個事物的頻繁項按照L中的順序進行重排。並按照重排以後的順序把每一個事物的每一個頻繁項插入以null爲根的FPTree中。若是插入時頻繁項節點已經存在了,則把該頻繁項節點支持度加1;若是該節點不存在,則建立支持度爲1的節點,並把該節點連接到項頭表中。

三、 調用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 iTree的頭部(按照支持度由低到高順序進行掃描){

                  產生一個模式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的執行過程。

一、 在FP-growth遞歸調用的第一層,模式先後a=NULL,獲得的其實就是頻繁1-項集。

二、 對每個頻繁1-項,進行遞歸調用FP-growth()得到多元頻繁項集。

下面舉兩個例子說明FP-growth的執行過程。

一、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}。

繪圖1

二、I5的狀況是比較簡單的,由於I5對應的條件FP-樹是單路徑的,咱們再來看一下稍微複雜一點的狀況I3。I3的條件模式基是(I2 I1:2), (I2:2), (I1:2),生成的條件FP-樹如左下圖,而後遞歸調用FP-growth,模式前綴爲I3。I3的條件FP-樹仍然是一個多路徑樹,首先把模式後綴I3和條件FP-樹中的項頭表中的每一項取並集,獲得一組模式{I2 I3:4, I1 I3:4},可是這一組模式不是後綴爲I3的全部模式。還須要遞歸調用FP-growth,模式後綴爲{I1,I3},{I1,I3}的條件模式基爲{I2:2},其生成的條件FP-樹如右下圖所示。這是一個單路徑的條件FP-樹,在FP_growth中把I2和模式後綴{I1,I3}取並獲得模式{I1 I2 I3:2}。理論上還應該計算一下模式後綴爲{I2,I3}的模式集,可是{I2,I3}的條件模式基爲空,遞歸調用結束。最終模式後綴I3的支持度>2的全部模式爲:{ I2 I3:4, I1 I3:4, I1 I2 I3:2}

      image         繪圖2

 

根據FP-growth算法,最終獲得的支持度>2頻繁模式以下:

item

條件模式基

條件FP-樹

產生的頻繁模式

I5

I4

I3

I1

{(I2 I1:1),(I2 I1 I3:1)

{(I2 I1:1), (I2:1)}

{(I2 I1:2), (I2:2), (I1:2)}

{(I2:4)}

<I2:2, I1:2>

<I2:2>

<I2:4, I1:2>, <I1:2>

<I2:4>

I2 I5:2, I1 I5:2, I2 I1 I5:2

I2 I4:2

I2 I3:4, I1 I3:4, I2 I1 I3:2

I2 I1:4

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

相關文章
相關標籤/搜索