關聯規則(Apriori算法)


關聯分析直觀理解   

關聯分析中最有名的例子是“尿布與啤酒”。據報道,美國中西部的一家連鎖店發現,男人們會在周四購買尿布和啤酒。這樣商店實際上可以將尿布與啤酒放在一塊,並確保在周四全價銷售從而獲利。當然,這家商店並沒有這么做。

       

 

頻繁項集是指那些經常出現在一起的物品集合,比如{葡萄酒,尿布, 豆奶}就是頻繁項集的一個例子

支持度(support)

     一個項集的支持度(support)被定義為數據集中包含該項集的記錄所占的比例 {豆奶}的支持度為4/5。{豆奶,尿布}的支持度為3/5

可信度(confidence )

      可信度或置信度(confidence)是針對一條諸如{尿布} ➞ {葡萄酒}的關聯規則來定義的。這條規則的可信度被定義為“支持度({尿布, 葡萄酒})/支持度({尿布})”。由於{尿布, 葡萄酒}的支持度為3/5,尿布的支持度為4/5,所以“尿布 ➞ 葡萄酒”的可信度為3/4=0.75。這意味着對於包含“尿布”的所有記錄,我們的規則對其中75%的記錄都適用。Apriori算法的目標是找到最大的K項頻繁集 支持度和可信度是用來量化關聯分析是否成功的方法。假設想找到支持度大於0.8的所有項集,應該如何去做?一個辦法是生成一個物品所有可能組合的清單,然后對每一種組合統計它出現的頻繁程度,但當物品成千上萬時,非常慢,這時就能用Apriori算法

關聯分析中最有名的例子是“尿布與啤酒”。據報道,美國中西部的一家連鎖店發現,男人們會在周四購買尿布和啤酒。這樣商店實際上可以將尿布與啤酒放在一塊,並確保在周四全價銷售從而獲利。當然,這家商店並沒有這么做。

 

一般我們使用三個指標來度量一個關聯規則,這三個指標分別是:支持度、置信度和提升度

Support(支持度):表示同時包含A和B的事務占所有事務的比例。如果用P(A)表示使用A事務的比例,那么Support=P(A&B)

Confidence(可信度):表示使用包含A的事務中同時包含B事務的比例,即同時包含A和B的事務占包含A事務的比例。公式表達:Confidence=P(A&B)/P(A)

Lift(提升度):表示“包含A的事務中同時包含B事務的比例”與“包含B事務的比例”的比值。公式表達:Lift=(P(A&B)/P(A))/P(B)=P(A&B)/P(A)/P(B)。

提升度反映了關聯規則中的A與B的相關性,提升度>1且越高表明正相關性越高,提升度<1且越低表明負相關性越高,提升度=1表明沒有相關性。

舉一個例子:

10000個超市訂單(10000個事務),其中購買三元牛奶(A事務)的6000個,購買伊利牛奶(B事務)的7500個,4000個同時包含兩者。

那么通過上面支持度的計算方法我們可以計算出:

三元牛奶(A事務)和伊利牛奶(B事務)的支持度為:P(A&B)=4000/10000=0.4.

三元牛奶(A事務)對伊利牛奶(B事務)的置信度為:包含A的事務中同時包含B的占包含A的事務比例。4000/6000=0.67,說明在購買三元牛奶后,有0.67的用戶去購買伊利牛奶。

伊利牛奶(B事務)對三元牛奶(A事務)的置信度為:包含B的事務中同時包含A的占包含B的事務比例。4000/7500=0.53,說明在購買三元牛奶后,有0.53的用戶去購買伊利牛奶。

上面我們可以看到A事務對B事務的置信度為0.67,看似相當高,但是其實這是一個誤導,為什么這么說?

因為在沒有任何條件下,B事務的出現的比例是0.75,而出現A事務,且同時出現B事務的比例是0.67,也就是說設置了A事務出現這個條件,B事務出現的比例反而降低了。這說明A事務和B事務是排斥的。 下面就有了提升度的概念。

我們把0.67/0.75的比值作為提升度,即P(B|A)/P(B),稱之為A條件對B事務的提升度,即有A作為前提,對B出現的概率有什么樣的影響,如果提升度=1,說明A和B沒有任何關聯,如果<1,說明A事務和B事務是排斥的,>1,我們認為A和B是有關聯的,但是在具體的應用之中,我們認為提升度>3才算作值得認可的關聯。

提升度是一種很簡單的判斷關聯關系的手段,但是在實際應用過程中受零事務的影響比較大,零事務在上面例子中可以理解為既沒有購買三元牛奶也沒有購買伊利牛奶的訂單。數值為10000-4000-2000-3500=500,可見在本例中,零事務非常小,但是在現實情況中,零事務是很大的。在本例中如果保持其他數據不變,把10000個事務改成1000000個事務,那么計算出的提升度就會明顯增大,此時的零事務很大(1000000-4000-2000-3500),可見提升度是與零事務有關的。

根據《數據挖掘概念與技術》一書的說法,常用的判斷方法 還不是提升度,而是 KULC度量+不平衡比(IR) 。他們可以有效的降低零事務造成的影響。

下面補充一下KULC和IR的說明: KULC=0.5*P(B|A)+0.5*P(A|B)

該公式表示 將兩種事件作為條件的置信度的均值,避開了支持度的計算,因此不會受零和事務的影響。在上例中,KULC值= (4000/6000+4000/7500)/2=0.6 IR=P(B|A)/P(A|B) ,IR用來指示一種情況 假如在上例中6000個事務包含三元牛奶,75000個包含伊利牛奶,同時購買依舊為4000 則: KULC=0.5*(4000/75000+4000/6000)=0.36 IR=(4000/6000)/(4000/75000)=12.5 這說明這兩個事務的關聯關系非常不平衡,購買三元牛奶的顧客很可能同時會買伊利牛奶,而購買了伊利牛奶的用戶不太會再去買三元牛奶。很好理解,A對B的支持度遠遠高於B對A的支持度。

 

Apriori算法

           

 

我們的數據集D有4條記錄,分別是134,235,1235和25。

現在我們用Apriori算法來尋找頻繁k項集,最小支持度設置為50%。

首先我們生成候選頻繁1項集,包括我們所有的5個數據並計算5個數據的支持度,計算完畢后我們進行剪枝,數據4由於支持度只有25%被剪掉。我們最終的頻繁1項集為1,2,3,5

現在我們鏈接生成候選頻繁2項集,包括12,13,15,23,25,35共6組。

掃描數據集計算候選頻繁2項集的支持度,由於12和15的支持度只有25%而被篩除,得到真正的頻繁2項集,包括13,23,25,35。

鏈接生成候選頻繁3項集,按照字典序組合,得到235。

 FP-Tree

Apriori作為一個挖掘頻繁項集的算法,Apriori算法需要多次掃描數據,I/O是很大的瓶頸。為了解決這個問題,FP Tree算法(也稱FP Growth算法)采用了一些技巧,無論多少數據,只需要掃描兩次數據集,因此提高了算法運行的效率。下面我們就對FP Tree算法做一個總結。

FP Tree算法小結   

這里我們對FP Tree算法流程做一個歸納。FP Tree算法包括三步:   

1)掃描數據,得到所有頻繁一項集的的計數。然后刪除支持度低於閾值的項,將1項頻繁集放入項頭表,並按照支持度降序排列。   

2)掃描數據,將讀到的原始數據剔除非頻繁1項集,並按照支持度降序排列。

3)讀入排序后的數據集,插入FP樹,插入時按照排序后的順序,插入FP樹中,排序靠前的節點是祖先節點,而靠后的是子孫節點。如果有共用的祖先,則對應的公用祖先節點計數加1。插入后,如果有新節點出現,則項頭表對應的節點會通過節點鏈表鏈接上新節點。直到所有的數據都插入到FP樹后,FP樹的建立完成。   

4)從項頭表的底部項依次向上找到項頭表項對應的條件模式基。從條件模式基遞歸挖掘得到項頭表項項的頻繁項集。   

5)如果不限制頻繁項集的項數,則返回步驟4所有的頻繁項集,否則只返回滿足項數要求的頻繁項集。

FP tree算法總結   

FP Tree算法改進了Apriori算法的I/O瓶頸,巧妙的利用了樹結構,這讓我們想起了BIRCH聚類,BIRCH聚類也是巧妙的利用了樹結構來提高算法運行速度。利用內存數據結構以空間換時間是常用的提高算法運行時間瓶頸的辦法。   

在實踐中,FP Tree算法是可以用於生產環境的關聯算法,而Apriori算法則做為先驅,起着關聯算法指明燈的作用。除了FP Tree,像GSP,CBA之類的算法都是Apriori派系的。


免責聲明!

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



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