Apriori算法詳解

Apriori算法詳解

  • 主要內容
    • 關聯分析
    • Apriori算法原理
    • 生成頻繁項集
    • 生成關聯規則
    • FP-Growth算法

  消費者在商店都買物品時,通過查看哪些商品經常在一起購買,可以幫助商店瞭解消費者的購買行爲。這種從數據海洋中抽取的知識可以用於商品定價、市場促銷、存貨管理等環節。從大規模數據集中尋找物品間的隱含關係被稱作關聯分析(association analysis)或者關聯規則學習(association rule learning)。這裏的主要問題在於,尋找物品的不同組合是一項十分耗時的任務,所需的計算代價很高,蠻力搜索方法並不能解決這個問題,所以需要用更智能的方法在合理的時間範圍內找到頻繁項集。本文介紹如何使用Apriori算法來解決上述問題。


1、關聯分析
  關聯分析是在大規模數據集中尋找有趣關係的任務。這些關係可以有兩種形式:頻繁項集關聯規則。頻繁項集(frequent item sets)是經常出現在一塊兒的物品的集合,關聯規則(association rules)暗示兩種物品之間可能存在很強的關係。下面用一個例子來說明這兩種概念,圖1給出了某個商店的交易清單。

這裏寫圖片描述
圖1

  頻繁項集是指那些經常出現在一起的商品集合,圖中的集合{葡萄酒,尿布,豆奶}就是頻繁項集的一個例子(一個集合即爲一個項集,頻繁項集即爲出現頻率較高的項集)。從這個數據集中也可以找到諸如”尿布➞葡萄酒”的關聯規則,即如果有人買了尿布,那麼他很可能也會買葡萄酒。使用頻繁項集和關聯規則,商家可以更好地理解他們的顧客。那麼,如何定義這些關係呢?我們通過支持度和可信度來度量這些有趣的關係。
  一個項集的支持度(support)被定義爲數據集中包含該項集的記錄所佔的比例。如上圖中,{豆奶}的支持度爲4/5,而在5條交易記錄中有3條包含{豆奶,尿布},因此{豆奶,尿布}的支持度爲3/5(此處的支持度採用的相對支持度,即比例形式3/5。有些教材上採用絕對支持度,即只有計數3,不需要除以總的交易記錄)。支持度是針對項集來說的,因此可以定義一個最小支持度,而只保留大於等於最小支持度的項集。
  可信度或置信度(confidence)是針對關聯規則來定義的。規則{尿布}➞{葡萄酒}的可信度被定義爲”支持度({尿布,葡萄酒})/支持度({尿布})”,由於{尿布,葡萄酒}的支持度爲3/5,尿布的支持度爲4/5,所以”尿布➞葡萄酒”的可信度爲3/4。這意味着對於包含”尿布”的所有記錄,我們的規則對其中75%的記錄都適用。
  支持度和可信度是用來量化關聯分析是否成功的方法。假設想找到支持度大於0.8的所有項集,應該如何去做?一個辦法是生成一個物品所有可能組合的清單,然後對每一種組合統計它出現的頻繁程度,但當物品成千上萬時,上述做法非常非常慢。Apriori算法,能夠有效減少關聯規則學習時所需要的計算量。

2、Apriori算法原理
  假設我們在經營一家商品種類並不多的雜貨店,我們對那些經常在一起被購買的商品非常感興趣。我們只有4種商品:商品0,1,2,3,代表圖1中所涉及的商品。那麼所有可能被一起購買的商品組合都有哪些?這些商品組合可能只有一種商品,比如商品0,也可能包括兩種、三種或者四種。我們並不關心某人買了兩件商品0或者四件商品2的情況,我們只關心他購買了一種或多種商品。圖2顯示了所有商品之間所有可能的組合,物品集合之間的連線表明兩個或者更多集合可以組合形成一個更大的集合。

這裏寫圖片描述
圖2

  前面說過,我們的目標是找到經常一起購買的物品集合,我們使用集合的支持度來度量其出現的頻率。一個集合的支持度是指有多少比例的交易記錄包含該集合。例如,集合{0,3},如何計算其支持度?我們遍歷每條記錄,並統計所有包含0和3的記錄,統計結果除以總的交易記錄數即爲支持度。
  我們不難發現,上述求解項集支持度的計算過程,即使對於僅有4種物品的集合,也需要遍歷數據15次。而隨着物品數目的增加,遍歷次數也會急劇地增加。對於包含N種物品的數據集,共有2N1 種項集組合。事實上,出售10000或者更多物品的商店並不少見,即使只出售100種商品的商店也會有1.26×1030 種可能的項集組合。這對於計算機而言,運算過程會變得異常緩慢。
  爲了降低計算所需時間,研究人員發現一種所謂的Apriori原理,可以幫助我們減少計算量。Apriori原理是說如果某個項集是頻繁的,那麼它的所有子集也是頻繁的,即如果{0,1}是頻繁的,那麼{0}、{1}也一定是頻繁的。更常用的是它的逆否命題,即如果一個項集是非頻繁的,那麼它的所有超集也是非頻繁的,即如果{0}、{1}是非頻繁的,那麼{0,1}也一定是非頻繁的。
  在圖3中,已知陰影項集{2,3}是非頻繁的。利用這個知識,我們就知道項集{0,2,3},{1,2,3}以及{0,1,2,3}也是非頻繁的。也就是說,一旦計算出了{2,3}的支持度,知道它是非頻繁的後(即支持度小於某個閾值minsupport),就不需要計算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因爲我們知道這些集合同樣也是非頻繁的。使用該原理就可以避免項集數目的指數增長,從而在合理時間內計算出頻繁項集。
這裏寫圖片描述
圖3

3、生成頻繁項集
  關聯分析的目標包括兩項:發現頻繁項集和發現關聯規則。首先需要找到頻繁項集,然後才能獲得關聯規則(正如前文所講,計算關聯規則的可信度需要用到頻繁項集的支持度)。
  Apriori算法是發現頻繁項集的一種方法。Apriori算法的兩個輸入參數分別是最小支持度和數據集。該算法首先會生成所有單個元素的項集列表。接着掃描數據集來查看哪些項集滿足最小支持度要求,那些不滿足最小支持度的集合會被去掉(剪枝)。然後,對剩下來的集合進行組合以生成包含兩個元素的項集(連接)。接下來,再重新掃描交易記錄,去掉不滿足最小支持度的項集。該過程重複進行直到所有項集都被去掉。
  例如,圖1中,只包含一個元素的項集的支持度如下表1:

這裏寫圖片描述
表1

  令最小支持度爲0.5,即表1中支持度大於等於0.5的項集,才能進行組合以生成包含兩個元素的項集。{豆奶}、{萵苣}、{尿布}、{葡萄酒},支持度大於等於最小支持度,可以進行兩兩組合。組合後,包含兩個元素的項集的支持度如下表2:
這裏寫圖片描述
表2

  由於最小支持度爲0.5,因此表2中支持度大於等於0.5的項集,才能進行組合以生成包含三個元素的項集。{豆奶,萵苣}、{豆奶,尿布}、{萵苣,尿布}、{尿布,葡萄酒},支持度大於等於最小支持度,可以進行兩兩組合。組合後,包含三個元素的項集的支持度如下表3:
這裏寫圖片描述
表3

  由於表3中,所有項集的支持度均小於最小支持度0.5,因此算法終止。上述過程中,表1、表2中綠色標註的項集即爲頻繁項集。

4、生成關聯規則
  一旦找出所有頻繁項集,就可以直接由他們產生強關聯規則(強關聯規則滿足最小支持度以及最小可信度)。對於可信度,可用式(1)計算:

confidence(AB)=P(B|A)=support(AB)support(A)     (1)

  條件概率用項集的支持度表示,其中,support(AB) 是包含元素A、B的項集的支持度,support(A) 是包含元素A的項集的支持度。根據式(1),關聯規則可以由如下方式產生:
  • 對於每個頻繁項集S ,產生S 的所有非空子集。
  • 對於S 的每個非空子集s ,如果support(t)support(s)min_confidence ,則輸出規則”s(Ss) ”。其中,min_confidence 爲最小置信度閾值。

  由於規則由頻繁項集產生,因此每個規則都自動的滿足最小支持度。
  關於關聯規則的獲取,此處借用上文中的例子進行講解。例如,表2中的一個頻繁項集S= {豆奶,萵苣},那麼由S 可以產生哪些關聯規則呢?由於S 的非空子集爲{豆奶}、{萵苣},因此根據式(1)可以得到如下規則,以及對應的可信度:

(1){豆奶}➞{萵苣},confidence=3/4=0.75
(2){萵苣}➞{豆奶},confidence=3/4=0.75

  假設最小置信度min_confidence=70% ,則上述兩條規則均滿足要求,均爲強關聯規則。所得規則(1)的語義爲:若消費者購買“豆奶”,則其有75% 的概率購買“萵苣”;所得規則(2)的語義爲:若消費者購買“萵苣”,則其有75% 的概率購買“豆奶”。

5、FP-Growth算法
  Apriori算法能夠有效發現頻繁項集並獲取關聯規則,但是每次計算頻繁項集的支持度(主要是指:項集所構成的超集的支持度)都要遍歷整個數據庫,因此造成過多的時間開銷,無法高效處理大規模數據集。爲了克服Apriori算法這一缺點,FP-Growth算法應運而生,FP-Growth算法能夠有效提高Apriori算法提取頻繁項集支持度的效率,詳細的介紹可以參考FP-Growth算法詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章