Apriori算法原理總結【轉載】

Apriori算法是經常使用的用於挖掘出數據關聯規則的算法,它用來找出數據值中頻繁出現的數據集合,找出這些集合的模式有助於咱們作一些決策。好比在常見的超市購物數據集,或者電商的網購數據集中,若是咱們找到了頻繁出現的數據集,那麼對於超市,咱們能夠優化產品的位置擺放,對於電商,咱們能夠優化商品所在的倉庫位置,達到節約成本,增長經濟效益的目的。下面咱們就對Apriori算法作一個總結。算法

1. 頻繁項集的評估標準

    什麼樣的數據纔是頻繁項集呢?也許你會說,這還不簡單,肉眼一掃,一塊兒出現次數多的數據集就是頻繁項集嗎!的確,這也沒有說錯,可是有兩個問題,第一是當數據量很是大的時候,咱們無法直接肉眼發現頻繁項集,這催生了關聯規則挖掘的算法,好比Apriori, PrefixSpan, CBA。第二是咱們缺少一個頻繁項集的標準。好比10條記錄,裏面A和B同時出現了三次,那麼咱們能不能說A和B一塊兒構成頻繁項集呢?所以咱們須要一個評估頻繁項集的標準。
    經常使用的頻繁項集的評估標準有支持度,置信度和提高度三個。
    支持度就是幾個關聯的數據在數據集中出現的次數佔總數據集的比重。或者說幾個數據關聯出現的機率。若是咱們有兩個想分析關聯性的數據X和Y,則對應的支持度爲:$$Support(X,Y) = P(XY) = \frac{number(XY)}{num(All Samples)}$$
    以此類推,若是咱們有三個想分析關聯性的數據X,Y和Z,則對應的支持度爲:$$Support(X,Y,Z) = P(XYZ) = \frac{number(XYZ)}{num(All Samples)}$$
    通常來講,支持度高的數據不必定構成頻繁項集,可是支持度過低的數據確定不構成頻繁項集。
    置信度體現了一個數據出現後,另外一個數據出現的機率,或者說數據的條件機率。若是咱們有兩個想分析關聯性的數據X和Y,X對Y的置信度爲$$Confidence(X \Leftarrow Y) = P(X|Y)=P(XY)/P(Y)$$
    也能夠以此類推到多個數據的關聯置信度,好比對於三個數據X,Y,Z,則X對於Y和Z的置信度爲:$$Confidence(X \Leftarrow YZ) = P(X|YZ)=P(XYZ)/P(YZ)$$
    舉個例子,在購物數據中,紙巾對應雞爪的置信度爲40%,支持度爲1%。則意味着在購物數據中,總共有1%的用戶既買雞爪又買紙巾;同時買雞爪的用戶中有40%的用戶購買紙巾。
    提高度表示含有Y的條件下,同時含有X的機率,與X整體發生的機率之比,即:$$Lift(X \Leftarrow Y) = P(X|Y)/P(X) = Confidence(X \Leftarrow Y) / P(X)$$
    提高度體先了X和Y之間的關聯關係, 提高度大於1則\(X \Leftarrow Y\)是有效的強關聯規則, 提高度小於等於1則\(X \Leftarrow Y\)是無效的強關聯規則 。一個特殊的狀況,若是X和Y獨立,則有\(Lift(X \Leftarrow Y) = 1\),由於此時\(P(X|Y) = P(X)\)
     通常來講,要選擇一個數據集合中的頻繁數據集,則須要自定義評估標準。最經常使用的評估標準是用自定義的支持度,或者是自定義支持度和置信度的一個組合。ide

2. Apriori算法思想

    對於Apriori算法,咱們使用支持度來做爲咱們判斷頻繁項集的標準。Apriori算法的目標是找到最大的K項頻繁集。這裏有兩層意思,首先,咱們要找到符合支持度標準的頻繁集。可是這樣的頻繁集可能有不少。第二層意思就是咱們要找到最大個數的頻繁集。好比咱們找到符合支持度的頻繁集AB和ABE,那麼咱們會拋棄AB,只保留ABE,由於AB是2項頻繁集,而ABE是3項頻繁集。那麼具體的,Apriori算法是如何作到挖掘K項頻繁集的呢?
    Apriori算法採用了迭代的方法,先搜索出候選1項集及對應的支持度,剪枝去掉低於支持度的1項集,獲得頻繁1項集。而後對剩下的頻繁1項集進行鏈接,獲得候選的頻繁2項集,篩選去掉低於支持度的候選頻繁2項集,獲得真正的頻繁二項集,以此類推,迭代下去,直到沒法找到頻繁k+1項集爲止,對應的頻繁k項集的集合即爲算法的輸出結果。
    可見這個算法仍是很簡潔的,第i次的迭代過程包括掃描計算候選頻繁i項集的支持度,剪枝獲得真正頻繁i項集和鏈接生成候選頻繁i+1項集三步。
    咱們下面這個簡單的例子看看:

    咱們的數據集D有4條記錄,分別是134,235,1235和25。如今咱們用Apriori算法來尋找頻繁k項集,最小支持度設置爲50%。首先咱們生成候選頻繁1項集,包括咱們全部的5個數據並計算5個數據的支持度,計算完畢後咱們進行剪枝,數據4因爲支持度只有25%被剪掉。咱們最終的頻繁1項集爲1235,如今咱們連接生成候選頻繁2項集,包括12,13,15,23,25,35共6組。此時咱們的第一輪迭代結束。
    進入第二輪迭代,咱們掃描數據集計算候選頻繁2項集的支持度,接着進行剪枝,因爲12和15的支持度只有25%而被篩除,獲得真正的頻繁2項集,包括13,23,25,35。如今咱們連接生成候選頻繁3項集,123, 135和235共3組,這部分圖中沒有畫出。經過計算候選頻繁3項集的支持度,咱們發現123和135的支持度均爲25%,所以接着被剪枝,最終獲得的真正頻繁3項集爲235一組。因爲此時咱們沒法再進行數據鏈接,進而獲得候選頻繁4項集,最終的結果即爲頻繁3三項集235。優化

3. Aprior算法流程

    下面咱們對Aprior算法流程作一個總結。
    輸入:數據集合D,支持度閾值\(\alpha\)
    輸出:最大的頻繁k項集
    1)掃描整個數據集,獲得全部出現過的數據,做爲候選頻繁1項集。k=1,頻繁0項集爲空集。
    2)挖掘頻繁k項集
      a) 掃描數據計算候選頻繁k項集的支持度
      b) 去除候選頻繁k項集中支持度低於閾值的數據集,獲得頻繁k項集。若是獲得的頻繁k項集爲空,則直接返回頻繁k-1項集的集合做爲算法結果,算法結束。若是獲得的頻繁k項集只有一項,則直接返回頻繁k項集的集合做爲算法結果,算法結束。
      c) 基於頻繁k項集,鏈接生成候選頻繁k+1項集。
    3) 令k=k+1,轉入步驟2。
    從算法的步驟能夠看出,Aprior算法每輪迭代都要掃描數據集,所以在數據集很大,數據種類不少的時候,算法效率很低。spa

Aprior算法總結

     Aprior算法是一個很是經典的頻繁項集的挖掘算法,不少算法都是基於Aprior算法而產生的,包括FP-Tree,GSP, CBA等。這些算法利用了Aprior算法的思想,可是對算法作了改進,數據挖掘效率更好一些,所以如今通常不多直接用Aprior算法來挖掘數據了,可是理解Aprior算法是理解其它Aprior類算法的前提,同時算法自己也不復雜,所以值得好好研究一番。
    不過scikit-learn中並無頻繁集挖掘相關的算法類庫,這不得不說是一個遺憾,不知道後面的版本會不會加上。
 
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)ci

相關文章
相關標籤/搜索