Apriori算法——關聯分析



查看原文:http://www.wyblog.cn/2017/01/05/apriori%e7%ae%97%e6%b3%95%e5%85%b3%e8%81%94%e5%88%86%e6%9e%90/

概念

Apriori算法是數據挖掘算法中的重要一員,它是通過對數據集進行關聯分析,從而分析出數據集裏項與項之間的關聯關係。算法最簡單直接的應用,當屬對超市裏被購買的物品的關聯分析,從而挖掘出顧客購買產品及其附屬產品的關係,例如經典的尿布與啤酒,或者現在各大電商網站上,當入手一樣物品後,會給推送來各種很可能被同時需要的東西,這就是關聯分析的威力。 先了解幾個關於此算法的概念。
  • 項集:項的集合,包含k個項的項集就是k-項集,例如{尿布,啤酒}就是個2-項集。
  • 項集支持度:指此項集在原始數據集出現的概率。概率論大數定理告訴我們,當n趨於無窮,那麼頻率趨近於概率。所以,一般我們直接使用頻數來作爲支持度。
  • 頻繁項集:對一個集合,裏面不只有項集,還有關於每個項集在原始數據集的出現頻數,並且,若項集裏每個項的支持度都大於最小值尺度閾值,那麼就稱這個項集爲頻繁項集。
  • 布爾關聯規則:形如A->B的形式。關聯規則的支持度爲P(AB),置信度爲P(AB)/P(A)。若一條關聯規則的支持度與置信度都大於人爲設定的最小關聯度與最小置信度閾值,那麼就稱它爲一條強關聯規則。
  • 支持度與置信度:支持度表示的是同時買A、B產品的概率,置信度表示的是買A的用戶中,同時買了B的概率。
Apriori算法是建立在對頻繁項集進行不斷挖掘、剪枝的過程,最後得出布爾關聯規則。其核心思想是通過生成候選項集,然後檢測其支持度與置信度進行剪枝來挖掘出頻繁項集,然後不斷重複這個過程。

算法描述

根據描述,要得到所有項集,那麼我們直接遍歷數據集中每一條記錄,然後窮舉出每一種可能,然後不斷計算就行了。可是,這種不動腦的算法最大的問題就是它完全沒有效率可言,窮舉的方式會導致窮舉出很多重複項,而且一般數據集都是非常大的,這會導致災難性後果。所以,Apriori算法採用了更有效的方式。 它採用逐層搜索的方式。
  1. 首先,第一層構建候選項集C1,它是一個1-項集,列舉出數據集裏出現過的所有單項,並統計出其頻數,然後根據定義的項集的最小支持度進行提前剪枝,剪掉那些小於最小支持度的項,得到頻繁1-項集。
  2. 接着,對1-項集裏的元素進行連接。連接有兩個條件:a)兩個項集K-1項是相同的。b)兩個項集連接後,它的全部子集應該都是頻繁集,然後再進行剪枝,剪掉小於最小支持度的項,得到頻繁2-項集。
  3. 然後重複1,2就能得到候選項集C3、頻繁3-項集、候選項集C4、頻繁4-項集,直到達到我們的迭代要求,得到最後的項集。
  4. 得到最後的項集,即是項與項之間關聯可能性較大的集合,例如爲{A,B,C},那麼我們就可以去計算A->B,A->C,B->C,A^B->C,A^C->B,B^C->A等等的置信度了,大於人工指定的最小置信度閾值的那些規則稱爲強規則,即我們要尋找的規則。

實例

下面用一個實例來看看Apriori算法的工作過程。以下爲一個商品購買的數據集,表示每一位用戶在ABCDE這五種產品中購買了哪幾種。 ccb64b7442bbf7d9e2ff71678c9b747e.png 簡單介紹下過程。定義最小支持度爲2,首先,根據數據集產生候選1-項集{A,B,C,D,E},並統計頻數,可以看到,{D}的支持度爲1,所以被剪枝,生成頻繁1-項集{A,B,C,E}。通過連接頻繁1-項集裏的項,則可得到候選2-項集並統計其在原數據集中出現的頻數,並根據最小支持度進行剪枝。注意最後在C3到L3的過程,{A,B,C}被剪枝,原因就在於其自己{A,B}不屬於頻繁2-項集,根據規則b),就被剪枝了。 最後可以去計算關聯規則的置信度:
  • B->C : 2/3
  • B->E : 3/3=1.0
  • C->E : 2/3
  • B->C^E : 2/2=1.0
  • C->B^E : 2/3
  • E->B^C : 2/2=1.0
以上列出了幾個基本規則,若我們定義最小置信度爲0.5,則以上均爲強規則。 從以上可以看出,Apriori算法存在一些缺點。其一,在每一步,都會產生候選項集,然後再產生頻繁項集,這會大大增加空間複雜度。其二,每一步計算支持度,都會去全部掃描一次數據集,這大大增加了時間複雜度,這對於大型數據庫是個災難。

算法優化

  • 優化一:基於哈希表的項集計數。將項集通過某種hash函數映射到表中不同的桶裏,這樣可以通過對桶中項集計數與最小支持度相比較,預先淘汰一部分。
  • 優化二:採樣。通過採樣,對數據集的子集進行Apriori算法,減少開銷。
  • 優化三:動態項集計數。在構建候選項集時,預先檢測其支持度是否滿足最小支持度,若滿足,則直接加進頻繁項集。

算法實現

佔位標記,一定要記得回來實現!

查看原文:http://www.wyblog.cn/2017/01/05/apriori%e7%ae%97%e6%b3%95%e5%85%b3%e8%81%94%e5%88%86%e6%9e%90/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章