關聯分析直觀理解 算法
關聯分析中最有名的例子是「尿布與啤酒」。據報道,美國中西部的一家連鎖店發現,男人們會在週四購買尿布和啤酒。這樣商店實際上能夠將尿布與啤酒放在一塊,並確保在週四全價銷售從而獲利。固然,這家商店並無這麼作。數據結構
頻繁項集是指那些常常出如今一塊兒的物品集合,好比{葡萄酒,尿布, 豆奶}就是頻繁項集的一個例子ide
支持度(support)spa
一個項集的支持度(support)被定義爲數據集中包含該項集的記錄所佔的比例 {豆奶}的支持度爲4/5。{豆奶,尿布}的支持度爲3/5blog
可信度(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派系的。