Apriori算法詳解

2021-02-19 Hello黃同學
Apriori算法簡介

Apriori算法是一種常用的用於挖掘出數據關聯規則(Association Rules)的算法,「apriori」在拉丁語中翻譯為「來自以前」,顧名思義,這個算法是使用先驗知識來預測數據的關聯規則。

說到關聯規則,我們不得不提到一個經典案例——啤酒與尿布。在這個案例中,沃爾瑪發現看似兩個無關的商品,它們卻經常被一起購買,這是為什麼呢?在美國有嬰兒的家庭中,一般是母親在家中照看嬰兒,年輕的父親前去超市購買尿布,父親在購買尿布的同時,往往會順便為自己購買啤酒,這樣就會出現啤酒與尿布這兩件看上去不相干的商品經常會出現在同一個購物籃的現象。這兩種看似不相干的商品之間顯現出強相關性,於是商家可以將啤酒貨架放在尿布貨架旁邊以增加收益。

這個案例中研究啤酒與尿布的關係的方法就叫做「購物籃分析」,本質上就是挖掘數據關聯規則,而Apriori算法就是最經典的關聯規則挖掘算法。

相關概念支持度(Support)

數據集中包含該項集的數據所佔數據集的比例,度量一個集合在原始數據中出現的頻率。關聯規則A->B的支持度support=P(AB),指的是事件A和事件B同時發生的概率(相當於聯合概率)。

通常我們需要事先設置一個支持度的閾值來對項集進行篩選。

置信度(Confidence)

置信度 

頻繁k項集(Frequent k Itemset)

項集就是項的集合,比如牛奶和麵包組成一個集合{牛奶,麵包},那麼牛奶和麵包就是項,而{牛奶,麵包}為一個二項集。頻繁項集表示的就是在數據集中頻繁出現的項集。如果事件A中包含k個元素,那麼稱這個事件A為k項集,並且事件A滿足最小支持度閾值的事件稱為頻繁k項集。

Apriori算法原理Apriori算法性質

如果某個項集是頻繁的,那麼它的所有子集也是頻繁的;

如果某個項集是非頻繁的,那麼它的所有超集也是非頻繁的;

如果頻繁k項集集合中包含單個項目i的個數小於k-1,則i不可能在頻繁k項集中;

基於此,Apriori算法從單元素項集開始,通過組合滿足最小支持度的項集來形成更大的集合。

其實Apriori算法就是通過排除法來選擇頻繁項集和關聯規則,算法的目標是找到最大的頻繁k項集。

Apriori算法過程

Apriori算法過程分為兩個步驟:

通過迭代,檢索出事務資料庫中的所有頻繁項集,即支持度不低於用戶設定的閾值的項集;

利用頻繁項集構造出滿足用戶最小置信度的關聯規則。

具體過程就是:

先搜索出候選1項集並計算對應的支持度,通過篩選去掉支持度低於閾值的候選1項集,得到頻繁1項集;

通過連接頻繁1項集得到候選2項集並計算對應的支持度,通過篩選去掉支持度低於閾值的候選2項集,得到頻繁2項集;

以此類推,不斷循環,直到無法發現頻繁k+1項集為止,此時的頻繁k項集便是算法的輸出結果。

Apriori算法步驟
由頻繁項集產生強關聯規則

在找到所有頻繁項集後,我們還需要根據頻繁項集生成關聯規則:

對於每個頻繁項集L,生成其所有的非空子集;

對與L的每個非空子集x,計算其置信度confidence(x),若confidence(x)大於等於最小置信度,則強規則x->(L-x)成立。

簡單的例子R語言中實現Apriori算法

R語言中的Apriori算法實現包含在arules包中。

數據源

利用arules包中自帶的Groceries數據集,該數據集是來自一個現實世界中的超市經營一個月的購物數據,包含了9835次交易。

> library(arules)
> data(Groceries)
> Groceries
transactions in sparse format with
 9835 transactions (rows) and
 169 items (columns)

探索性數據分析

通過inspect()函數可以看到超市的交易記錄。

> inspect(Groceries[1:5])
    items                     
[1] {citrus fruit, semi-finished bread, margarine, ready soups}             
[2] {tropical fruit, yogurt,                  
     coffee}                  
[3] {whole milk}              
[4] {pip fruit, yogurt, cream cheese, meat spreads}            
[5] {other vegetables, whole milk, condensed milk, long life bakery product}

通過summary()函數可以查看該數據集的一些基本信息。

> summary(Groceries)
transactions as itemMatrix in sparse format with
 9835 rows (elements/itemsets/transactions) and
 169 columns (items) and a density of 0.02609146 

most frequent items:
      whole milk other vegetables       rolls/buns             soda 
            2513             1903             1809             1715 
          yogurt          (Other) 
            1372            34055 

element (itemset/transaction) length distribution:
sizes
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
2159 1643 1299 1005  855  645  545  438  350  246  182  117   78   77   55   46 
  17   18   19   20   21   22   23   24   26   27   28   29   32 
  29   14   14    9   11    4    6    1    1    1    1    3    1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   4.409   6.000  32.000 

includes extended item information - examples:
       labels  level2           level1
1 frankfurter sausage meat and sausage
2     sausage sausage meat and sausage
3  liver loaf sausage meat and sausage

通過itemFrequency()函數可以查看商品的交易比例。

> itemFrequency(Groceries[,1:3])
frankfurter     sausage  liver loaf 
0.058973055 0.093950178 0.005083884 

通過以上數據我們可以得出以下結果:

該數據集一共有9835行(交易記錄),169列(所有交易的商品種類),因此矩陣中共有 

most frequent items:列出了事務型數據中最常購買的商品。whole milk在9835次交易中被購買了2513次,因此我們可以得出結論:whole milk有2513/9835=25.6%的概率出現在所有的交易中;

element (itemset/transaction) length distribution:呈現了一組關於交易規模的統計,總共有2159次交易中包含一件商品,有1次交易中包含了32件商品。我們可以看出,25%的交易中包含了兩件或者更少的商品,大約一半的交易中商品數量不超過3件。

為了直觀地呈現統計數據,可以使用itemFrequenctyPlot()函數生成一個用於描繪所包含的特定商品的交易比例的柱狀圖。因為包含很多種商品,不可能同時展現出來,因此可以通過support或者topN參數進行排除一部分商品進行展示。

> itemFrequencyPlot(Groceries,support = 0.1)  # support = 0.1 表示支持度至少為0.1

support = 0.1

> itemFrequencyPlot(Groceries,topN = 20)  # topN = 20 表示支持度排在前20的商品

topN = 20

通過使用image()函數可以可視化整個稀疏矩陣。

> image(Groceries[1:5]) # 生成一個5行169列的矩陣,矩陣中填充有黑色的單元表示在此次交易(行)中,該商品(列)被購買了

可視化稀疏矩陣

從上圖可以看出,第一行記錄(交易)包含了四種商品(黑色的方塊),這種可視化的圖是用於數據探索的一種很有用的工具。它可能有助於識別潛在的數據問題,比如:由於列表示的是商品名稱,如果列從上往下一直被填充表明這個商品在每一次交易中都被購買了;另一方面,圖中的模式可能有助於揭示交易或者商品的有趣部分,特別是當數據以有趣的方式排序後,比如,如果交易按照日期進行排序,那麼黑色方塊圖案可能會揭示人們購買商品的數量或者類型受季節性的影響。這種可視化對於超大型的交易數據集是沒有意義的,因為單元太小會很難發現有趣的模式。

訓練模型

> grocery_rules <- apriori(data=Groceries,parameter=list(support =,confidence =,minlen =))

運行apriori()函數很簡單,但是找到支持度和置信度參數來產生合理數量的關聯規則時,可能需要進行大量的試驗與誤差評估。

如果參數設置過高,那麼結果可能是沒有規則或者規則過於普通而不是非常有用的規則;如果閾值太低,可能會導致規則數量很多,甚至需要運行很長的時間或者在學習階段耗盡內存。

aprior()函數默認設置 

> apriori(Groceries)
set of 0 rules

因為 

解決支持度設定問題的一種方法是:考慮一個有趣的模式之前,事先想好需要的最小交易數量,例如:我們可以認為如果一種商品一天被購買了2次,一個月也就是60次交易記錄,這或許是我們所感興趣的,據此,可以計算所需要的支持度 

關於置信度:設置太低,可能會被大量不可靠的規則淹沒,設置過高,可能會出現很多顯而易見的規則致使我們不能發現有趣的模式;一個合適的置信度水平的選取,取決於我們的分析目標,我們可以嘗試以一個保守的值開始,如果發現沒有具有可行性的規則,可以降低置信度以拓寬規則的搜索範圍。

在此例中,我們將從置信度0.25開始,這意味著為了將規則包含在結果中,此時規則的正確率至少為25%,這將排除最不可靠的規則。

 

最終,根據上面的分析我們確定如下參數設置:

> grocery_rules <- apriori(data = Groceries,parameter = list(support = 0.006,confidence = 0.25,minlen = 2))
> grocery_rules
set of 463 rules

關聯規則可視化

使用arulesViz包可對關聯規則進行可視化。

> library(arulesViz)

通過plot()函數可以得到生成規則的散點圖以及散點矩陣

> plot(grocery_rules)

關聯規則散點圖

> plot(grocery_rules@quality)

關聯規則散點矩陣

> highLiftRules <- head(sort(grocery_rules, by = "lift"), 5)
> plot(highLiftRules, method = "graph", control = list(type = "items"))

lift值最高的5個關聯規則

圓圈的大小表示支持度的大小,不同的項目通過有向箭頭指向同一個支持度,表示相應項目組成的一個項集。

評估模型的性能

> summary(grocery_rules)
set of 463 rules

rule length distribution (lhs + rhs):sizes  # 前件+後件的規則長度分布
  2   3   4 
150 297  16  #有150個規則只包含2種商品,297個規則包含3種商品,16個規則包含4種商品

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.000   3.000   2.711   3.000   4.000 

summary of quality measures:
    support           confidence        coverage             lift       
 Min.   :0.006101   Min.   :0.2500   Min.   :0.009964   Min.   :0.9932  
 1st Qu.:0.007117   1st Qu.:0.2971   1st Qu.:0.018709   1st Qu.:1.6229  
 Median :0.008744   Median :0.3554   Median :0.024809   Median :1.9332  
 Mean   :0.011539   Mean   :0.3786   Mean   :0.032608   Mean   :2.0351  
 3rd Qu.:0.012303   3rd Qu.:0.4495   3rd Qu.:0.035892   3rd Qu.:2.3565  
 Max.   :0.074835   Max.   :0.6600   Max.   :0.255516   Max.   :3.9565  
     count      
 Min.   : 60.0  
 1st Qu.: 70.0  
 Median : 86.0  
 Mean   :113.5  
 3rd Qu.:121.0  
 Max.   :736.0  

mining info:
      data ntransactions support confidence
 Groceries          9835   0.006       0.25

> inspect(grocery_rules[1:5])
     lhs             rhs                support     confidence coverage   lift    
[1] {pot plants} => {whole milk}       0.006914082 0.4000000  0.01728521 1.565460
[2] {pasta}      => {whole milk}       0.006100661 0.4054054  0.01504830 1.586614
[3] {herbs}      => {root vegetables}  0.007015760 0.4312500  0.01626843 3.956477
[4] {herbs}      => {other vegetables} 0.007727504 0.4750000  0.01626843 2.454874
[5] {herbs}      => {whole milk}       0.007727504 0.4750000  0.01626843 1.858983
    count
[1] 68   
[2] 60   
[3] 69   
[4] 76   
[5] 76   

這裡需要解釋一下lift(提升度),表示用來度量一類商品相對於它的一般購買率,此時被購買的可能性有多大。通俗的講就是:比如第一條規則 

第一條規則解讀:如果一個顧客購買了pot plants,那麼他還會購買whole milk,支持度support為0.0070,置信度confidence為0.4000,我們可以確定該規則涵蓋了大約0.7%的交易,而且在購買了pot plants後,他購買whole milk的概率為40%,提升度lift值為1.565,表明他相對於一般沒有購買pot plant商品的顧客購買whole milk商品的概率提升了1.565倍,我們在上面的分析中知道,有25.6%的顧客購買了whole milk,因此計算提升度為 

提升度 

如果 

提高模型的性能

對關聯規則集合排序:根據購物籃分析的目標,最有用的規則或許是那些具有高支持度、信度和提升度的規則。arules包中包含一個sort()函數,通過指定參數by為"support","confidence"或者"lift"對規則列表進行重新排序。在默認的情況下,排序是降序排列,可以指定參數decreasing=FALSE反轉排序方式。

> inspect(sort(grocery_rules,by="lift")[1:10])
    lhs                                             rhs                  support     confidence lift   
3   {herbs}                                      => {root vegetables}    0.007015760 0.4312500  3.956477
57  {berries}                                    => {whipped/sour cream} 0.009049314 0.2721713  3.796886
450 {tropical fruit,other vegetables,whole milk} => {root vegetables}    0.007015760 0.4107143  3.768074
174 {beef,other vegetables}                      => {root vegetables}    0.007930859 0.4020619  3.688692
285 {tropical fruit,other vegetables}            => {pip fruit}          0.009456024 0.2634561  3.482649
176 {beef,whole milk}                            => {root vegetables}    0.008032537 0.3779904  3.467851
284 {pip fruit,other vegetables}                 => {tropical fruit}     0.009456024 0.3618677  3.448613
282 {pip fruit,yogurt}                           => {tropical fruit}     0.006405694 0.3559322  3.392048
319 {citrus fruit,other vegetables}              => {root vegetables}    0.010371124 0.3591549  3.295045
455 {other vegetables,whole milk,yogurt}         => {tropical fruit}     0.007625826 0.3424658  3.263712

提取關聯規則的子集:可以通過subset()函數提取我們感興趣的規則。

> fruit_rules <- subset(grocery_rules,items %in% "pip fruit")  # items 表明與出現在規則的任何位置的項進行匹配,為了將子集限制到匹配只發生在左側或者右側位置上,可以使用lhs或者rhs代替
> fruit_rules
set of 21 rules
> inspect(fruit_rules[1:5])
    lhs                           rhs                support     confidence lift   
127 {pip fruit}                => {tropical fruit}   0.020437214 0.2701613  2.574648
128 {pip fruit}                => {other vegetables} 0.026131164 0.3454301  1.785237
129 {pip fruit}                => {whole milk}       0.030096594 0.3978495  1.557043
281 {tropical fruit,pip fruit} => {yogurt}           0.006405694 0.3134328  2.246802
282 {pip fruit,yogurt}         => {tropical fruit}   0.006405694 0.3559322  3.392048

相關焦點

  • 【典型算法】Apriori
    其中arules用於管理規則的數位化生產,提供Apriori和Eclat兩種快速挖掘頻繁項集和關聯規則算法的現實函數;arulesViz作為arules的擴展包,提供了實用而新穎的關聯規則可視化技術,使得關聯分析從算法運行到結果呈現一體化。
  • 數據挖掘之關聯規則算法(Apriori)
    1 關聯規則挖掘定義大多數關聯規則挖掘算法通常採用的一種策略是,將關聯規則挖掘任務分解為如下兩個主要的子任務:頻繁項集產生(Frequent Itemset Generation2 Apriori算法介紹Apriori算法的原理通過限制候選產生發現頻發項集由頻繁項集產生關聯規則
  • 機器學習實戰(15.2):Apriori算法示例
    在前一章我們了解了Apriori算法。它可以通過尋找物品的不同組合,找到頻繁項以及頻繁項之間的關聯,今天為大家帶來的是Apriori算法的實際應用示例。我們會通過一個從毒蘑菇中尋找相似特徵的示例來看Apriori算法是如何發現頻繁項以及找到他們的關聯關係的。
  • 十大經典數據挖掘算法—Apriori
    打開APP 十大經典數據挖掘算法—Apriori 發表於 2018-02-04 09:37:56 因此,我們需要找出複雜度更低的算法用於關聯分析。 2. Apriori算法Agrawal與Srikant提出Apriori算法,用於做快速的關聯規則分析。
  • Apriori算法原理與實現
    APRIORI是一種用於發現頻繁模式的算法,其主要面向布爾關聯規則的事務集。其理論前提在於,頻繁項集的所有非空子集也都是頻繁的的先驗性質。在實施過程中,其使用逐層迭代的方法,基於候選集找出頻繁項集。Apriori算法的缺點在於對資料庫掃描次數過多及產生過多的中間項集,因而需要通過諸如哈希項集、事務壓縮、劃分等方法進行算法效率的提高。
  • 關聯規則的挖掘與應用——Apriori和CBA算法
    文|光大科技大數據部 魏樂 盧格潤1 關聯規則1.1 關聯規則基本概念1.2 Apriori算法基本思路2 關聯分類2.1 CBA關聯分類算法思路1.2 Apriori算法基本思路關聯規則的挖掘可以分為兩步,第一步找到頻繁項集,第二步從頻繁項集中再找出滿足最小置信度的強關聯規則。整體來看,第二步比較簡單,主要算力都耗費在第一步上,如果採用統計方法,需要將所有K項集統計一遍,費時耗力。
  • 關聯規則R語言實戰(Apriori算法)
    作者:婷婷糖博客專欄:https://ask.hellobi.com/blog/tingtingtang最近遇到一個業務問題需要用關聯規則的算法來實現,為了解決業務問題,我又重新複習了一遍以前就學過的Apriori算法並將其運用到業務場景中。下面,我想談一談在具體的業務實現過程中我的一些感想。
  • 機器學習 關聯規則(Apriori)及實例解析
    這就歸功於關聯規則(Apriori)算法了。今天小編給大家介紹關聯規則算法的原理及使用實例。關聯規則就是發現存在於大量數據集中的關聯性或相關性,從而描述了一個事物中某些屬性同時出現的規律和模式。由關聯規則作出的推論並不必然蘊涵因果關係。它只表示規則前件和後件中的項明顯地同時出現。
  • 一步步教你學Apriori算法
    數據挖掘十大算法Apriori 算法是一種最有影響力的挖掘布爾關聯規則的頻繁項集算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的。它使用一種稱作逐層搜索的迭代方法,k- 項集用於探索(k+1)- 項集。首先,找出頻繁 1- 項集的集合。該集合記作L1。
  • 關聯規則挖掘基本概念與Aprior算法
    三、Apriori定律為了減少頻繁項集的生成時間,我們應該儘早的消除一些完全不可能是頻繁項集的集合,Apriori的兩條定律就是幹這事的。Apriori定律1):如果一個集合是頻繁項集,則它的所有子集都是頻繁項集。
  • 數據挖掘原理與實戰(一)--關聯規則Apriori算法
    首先會先學習數據挖掘的重要算法和實戰,在有了一個較為清晰的認識之後,再開始從理論上理清數據挖掘的理論體系,與大家共勉。今天首先分享最經典的數據挖掘算法Apriori算法,它屬於關聯規則挖掘算法,我們常聽到的「啤酒與尿布」的故事就是源於此類算法。
  • EM算法詳解
    EM算法簡介3. 預備知識    3.1 極大似然估計    3.2 Jensen不等式4. EM算法詳解    4.1 問題描述    4.2 EM算法推導流程    4.3 EM算法流程5.EM算法若干思考    5.1 對EM算法的初始化研究    5.2 EM算法是否一定收斂?    5.3 如果EM算法收斂,能否保證收斂到全局最大值?6. EM算法實例7. 對EM算法總結1.
  • 技術分享|大數據挖掘算法之FP-Growth算法
    >             我們常說我們生活在資訊時代,實際上,我們更多的還是生活在數據時代。隨著數據在黨的十九屆四中全會中與勞動、資本、土地、知識、技術、管理等一起被列為生產要素,數據價值的挖掘將會越來越深入。數據挖掘在《Data Mining》一書中的解釋就是從大量數據中挖掘有趣模式和知識的過程。既然未來已來,我們就要順應時代發展,掌握必備技能。     在前面我們介紹了一種簡單的挖掘商品關聯性算法。
  • 數據挖掘十大經典算法
    :C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.不僅僅是選中的十大算法,其實參加評選的18種算法,實際上隨便拿出一種來都可以稱得上是經典算法,它們在數據挖掘領域都產生了極為深遠的影響。1.C4.5C4.5算法是機器學習算法中的一種分類決策樹算法,其核心算法是ID3算法.
  • 機器學習(三) 關聯規則Apriori算法R語言實戰
    Apriori算法簡介關聯規則中,關鍵點是:1)找出頻繁項集;2)合理地設置三種閾值;3)找出強關聯規則直接遍歷所有的項目集,並計算其支持度、置信度和提升度,計算量太大,無法應用於工程實踐。Apriori算法可用於快速找出頻繁項集。。
  • 常用算法詳解——列印楊輝三角形
    在中國南宋數學家楊輝1261年所著的《詳解九章算法》一書中出現。在歐洲,這個表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年。楊輝三角是中國古代數學的傑出研究成果之一,它把二項式係數圖形化,把組合數內在的一些代數性質直觀地從圖形中體現出來,是一種離散型的數與形的結合。
  • 二十、數據挖掘之Eclat算法介紹
    Eclat算法簡介數據格式Apriori算法和FpGrowth都是從項集格式{TID: itemset}的事物集中挖掘頻繁模式,其中TID是事物標誌符,而itemset是事物TID中購買的商品。這種數據格式成為水平數據格式。
  • Machine Learning-常見算法優缺點匯總
    >1、決策樹易於理解和解釋,可以可視化分析,容易提取出規則。3、樸素貝葉斯對結果解釋容易理解。樸素貝葉斯缺點1、由於使用了樣本屬性獨立性的假設,所以如果樣本屬性有關聯時其效果不好。算法的核心就是要優化失真函數J,使其收斂到局部最小值但不是全局最小值。其中N為樣本數,K是簇數,rnk b表示n屬於第k個簇,uk 是第k個中心點的值。
  • 密碼學_RSA算法原理詳解
    RSA算法簡介:     RSA算法 是一種公鑰加密算法,RSA算法相比別的算法思路非常清晰,但是想要破解的難度非常大
  • 機器學習-聚類算法k-均值詳解
    對於含有n個數據的數據集D,以及簇數k,本文所講的劃分算法將基於距離函數,將對象組劃分成k個分區,每個分區代表一個簇,並儘量使簇中對象相似,不同簇中對象相異。使用簇內變差來衡量Ci的質量,它是Ci中所有對象和形心直接的誤差的平方和:定義E為數據集中所有對象的誤差平方和:算法原理為了得到k個簇,k-均值算法首先在D中隨機的選取k個對象,作為k個簇的中心。對於剩下的每個對象,根據其與各個簇中心的歐式距離,將其分配到最近的一個簇中。