1. 程式人生 > >Apriori演算法詳解

Apriori演算法詳解

Apriori演算法總結

一、背景

關聯規則學習(Association rule learning)是一種在大型資料庫中發現變數之間的有趣性關係的方法。它的目的是利用一些有趣性的量度來識別資料庫中發現的強規則。

關聯分析是一種在大規模資料集中尋找有趣關係的任務。這些關係可以有兩種形式:頻繁項 集或者關聯規則。頻繁項集(frequent item sets)是經常出現在一塊的物品的集合,關聯規則(association rules)暗示兩種物品之間可能存在很強的關係。

二、理論

當尋找頻繁項集時,頻繁(frequent)的定義是什麼?

最重要的是支援度和可信度。

1

、一個項集的支援度(support)

被定義為資料集中包含該項集的記錄所佔的比例。支援度是針對項集來說的,因此可以定義一個最小支援度,而只保留滿足最小支援度的項集。

2、可信度或置信度(confidence)

是針對一條諸如{尿布} ➞ {啤酒}的關聯規則來定義的。這 條規則的可信度被定義為“支援度({尿布, 啤酒})/支援度({尿布})”

假設{尿布, 啤酒}的支援度為3/5,尿布的支援度為4/5,則“尿布 ➞ 啤酒”的可信度為3/4=0.75。簡單來說,就是使用者購買尿布的事件中包含“購買尿布和啤酒”的比率。這意味著對於包含“尿布”的所有記錄,我們的規則對其中75%的記錄都適用。

3Lift(提升度):表示“包含A的事務中同時包含B事務的比例”與“包含B事務的比例”的比值。公式表達:Lift=( P(A&B)/P(A))/P(B)=P(A&B)/P(A)/P(B)。提升度反映了關聯規則中的AB的相關性,提升度>1且越高表明正相關性越高,提升度<1且越低表明負相關性越高,提升度=1表明沒有相關性。

為了減少頻繁項集的生成時間,可以儘早的消除一些完全不可能是頻繁項集的集合,用到Apriori的兩條定律。

Apriori定律1如果一個集合是頻繁項集,則它的所有子集都是頻繁項集。舉例:假設一個集合{A,B}是頻繁項集,即AB同時出現在一條記錄的次數大於等於最小支援度

min_support,則它的子集{A},{B}出現次數必定大於等於min_support,即它的子集都是頻繁項集。

Apriori定律2:如果一個集合不是頻繁項集,則它的所有超集都不是頻繁項集。舉例:假設集合{A}不是頻繁項集,即A出現的次數小於min_support,則它的任何超集如{A,B}出現的次數必定小於min_support,因此其超集必定也不是頻繁項集。

               

三、演算法流程

接下來可以看Apriori演算法的簡單流程:

 

資料集:

[ [麵包,牛奶],

[麵包,尿布,啤酒,雞蛋],

[牛奶,尿布,啤酒,可樂],

[麵包,牛奶,尿布,啤酒],

[麵包,牛奶,尿布,可樂] ]

流程如下:

 

得到頻繁項集之後,再由頻繁項集中可以得到強關聯規則(滿足最小支援度和最小置信度的關聯規則)。這裡我沒有找到流程圖,於是直接從程式執行截圖來看:

 

這是我設定支援度為0.3,得到的所有頻繁集:

後對規則進行分析,從二項集開始計算,以下是生成的關聯規則進行分析:

接下來是三項集,舉個例子:

即是說,對一個頻繁項集,會先找出所有子集,再在迴圈每次分析一個子集與原項集去除該子集剩下的資料的置信度和提升度,進行對比,此時我若設定置信度大於0.7,提升度大於1,則最終結果如下:

例說明一下lift的作用:

比如說,之前的例子中,總事件5件,購買牛奶的4個,購買尿布的有四個,兩種都買的有三個,所以牛奶(A)的支援度P(A)=0.8,而牛奶(A)對尿(B)的置信度為包含A的事務中同時包含B的佔包含A的事務比例,為0.75,置信度看起來挺高的,但其實不可取,因為在沒有任何條件下,B事務的出現的比例是0.8,也就是說設定了A事務出現這個條件,B事務出現的比例反而降低了。這說明A事務和B事務是排斥的。

通俗來講,就是說,B事務不是因為A事務出現而出現,有可能是B事務本身出現的次數就很多.比如說,B事務在所有的事務集裡都出現了,也就是說出現的概率為1了,還能說是因為A事務出現,B事務才出現嗎?

 

四、演算法學習總結

1、當每一個事件出現物品很多時,如果支援度、置信度閾值設定太低,關聯規則會特別多,得到的結果沒有價值;

eg. 資料為:

[[1,3,9,13,23,25,34,36,38,40,52,54,59,63,67,76,85,86,90,93,98,107,113],[2,3,9,14,23,26,34,36,39,40,52,55,59,63,67,76,85,86,90,93,99,108,114],[2,4,9,15,23,27,34,36,39,41,52,55,59,63,67,76,85,86,90,93,99,108,115],[1,3,10,15,23,25,34,36,38,41,52,54,59,63,67,76,85,86,90,93,98,107,113],[2,3,9,16,24,28,34,37,39,40,53,54,59,63,67,76,85,86,90,94,99,109,114],[2,3,10,14,23,26,34,36,39,41,52,55,59,63,67,76,85,86,90,93,98,108,114],[2,4,9,15,23,26,34,36,39,42,52,55,59,63,67,76,85,86,90,93,98,108,115],[2,4,10,15,23,27,34,36,39,41,52,55,59,63,67,76,85,86,90,93,99,107,115],[1,3,10,15,23,25,34,36,38,43,52,54,59,63,67,76,85,86,90,93,98,110,114]]

 

2、當有很多個事件時,若每個事件的物品很少,支援度、置信度閾值設定太高,關聯規則會特別少,這個時候得到的結果也是沒有價值;

3、故而,我覺得在初始資料和支援度、置信度之間,是要通過實際測試以及考慮預期結果來獲得幾個比較好的引數,也即是說,即便是Apriori這種相對其他複雜演算法較為經典且基礎的演算法也是需要調參的。