1. 程式人生 > >【機器學習】資料探勘演算法——關聯規則(二),挖掘過程,Aprioir演算法

【機器學習】資料探勘演算法——關聯規則(二),挖掘過程,Aprioir演算法

關聯規則挖掘的原理和過程

關聯規則(一)的分析中可知,關聯規則挖掘是從事務集合中挖掘出這樣的關聯規則:它的支援度和置信度大於最低閾值(minsup,minconf),這個閾值是由使用者指定的。根據 support=(X,Y).count/T.countsupport=(X,Y).count/T.count

confidence=(X,Y).count/X.countconfidence=(X,Y).count/X.count

要想找出滿足條件的關聯規則,首先必須找出這樣的集合F=XYF=X \cup Y

,它滿足F.count/T.countminsupF.count/T.count \geq minsup,其中F.countF.countTT中包含FF的事務的個數,然後再從FF中找出這樣的蘊含式XYX\to Y,它滿足(X,Y).count/X.countminconf(X,Y).count/X.count ≥ minconf,並且X=FYX=F-Y。我們稱像FF這樣的集合稱為頻繁專案集,假如FF中的元素個數為kk,我們稱這樣的頻繁專案集為k
k-頻繁專案集
,它是專案集合II的子集。所以關聯規則挖掘可以大致分為兩步:

  1. 從事務集合中找出頻繁專案集;
  2. 從頻繁專案集合中生成滿足最低置信度的關聯規則。

通俗的理解: 頻繁項集所依賴的支援度其實就是覆蓋率。 關聯規則所依賴的可信度其實就是條件概率。

用於求解關聯規則頻繁項集的演算法較為常用的有三種:

  1. Apriori
  2. FP-Growth
  3. Eclat

本章節主要介紹Apriori演算法。

Apriori演算法

最出名的關聯規則挖掘演算法是Apriori演算法,它主要利用了向下封閉屬性:如果一個項集是頻繁專案集,那麼它的非空子集必定是頻繁專案集。它先生成1-頻繁專案集,再利用1-頻繁專案集生成2-頻繁專案集。。。然後根據2-頻繁專案集生成3-頻繁專案集…依次類推,直至生成所有的頻繁專案集,然後從頻繁專案集中找出符合條件的關聯規則。

下面來討論一下頻繁專案集的生成過程,它的原理是根據kk-頻繁專案集生成(k+1)(k+1)-頻繁專案集。因此首先要做的是找出11-頻繁專案集,這個很容易得到,只要迴圈掃描一次事務集合統計出專案集合中每個元素的支援度,然後根據設定的支援度閾值進行篩選,即可得到11-頻繁專案集。下面證明一下為何可以通過kk-頻繁專案集生成(k+1)(k+1)-頻繁專案集:

假設某個專案集S={s1,s2,sn}S=\{s_1,s_2,\cdots s_n\}是頻繁專案集,那麼它的(n1)(n-1)非空子集{s1,s2,sn1}\{s_1,s_2,\cdots s_{n-1}\}{s1,s2,sn2,sn}\{s_1,s_2,\cdots s_{n-2},s_n\} \cdots {s2,s3,sn}\{s_2,s_3,\cdots s_n\}必定都是頻繁專案集,通過觀察,任何一個含有n個元素的集合A={a1,a2,an}A=\{a_1,a_2,\cdots a_n\},它的(n1)(n-1)非空子集定會包含兩項{a1,a2,an2,an1}\{a_1,a_2,\cdots a_{n-2},a_{n-1}\}{a1,a2,an2,an}\{a_1,a_2,\cdots a_{n-2},a_n\},對比這兩個子集可以發現,它們的前(n2)(n-2)項是相同的,它們的並集就是集合AA。對於2-頻繁專案集,它的所有1非空子集也必定是頻繁專案集,那麼根據上面的性質,對於2-頻繁專案集中的任一個,在1-頻繁專案集中必定存在2個集合(不需要一定是最後一個元素不同)的並集與它相同。因此在所有的1-頻繁專案集中找出只有一項不同的集合,將其合併,即可得到所有的包含2個元素的專案集,得到的這些包含2個元素的專案集不一定都是頻繁專案集,所以需要進行剪枝。剪枝的辦法是看它的所有1非空子集是否在1-頻繁專案集中,如果存在1非空子集不在1-頻繁專案集中,則將該2專案集剔除。經過該步驟之後,剩下的則全是頻繁專案集,即2-頻繁專案集。依次類推,可以生成3-頻繁專案集…直至生成所有的頻繁專案集。

生成頻繁項集

生成一個頻繁集的步驟分聯合剪枝兩步。

  1. 聯合(join),虛擬碼如下:

其中Lk1L_{k-1}為頻繁集。合併只有一個元素不同的itemitem,如(1,2,3)、(1,3,7)和(1,4,9),就會是(1,2,3)和(1,3,7)合併成(1,2,3,7),而不會其他的合併,因為其他情況,兩元素有不只一個元素不同(為確保合併後的項集元素只增加了一個)。

  1. 剪枝(pruning) 合併後的集合,如果有子集不在原集合中,則把該合併集合刪除。例如:有2-頻繁專案集   {1,2}{1,3}{1,4}{2,3}{2,4}\{1,2\},\{1,3\},\{1,4\},\{2,3\},\{2,4\} 因為{1,2}{1,3}{1,4}\{1,2\},\{1,3\},\{1,4\}除了最後一個元素以外都相同,所以求{1,2}{1,3}\{1,2\},\{1,3\}的並集得到{1,2,3}\{1,2,3\}{1,2}\{1,2\}{1,4}\{1,4\}的並集得到{1,2,4}{1,3}{1,4}\{1,2,4\},\{1,3\}和\{1,4\}的並集得到{1,3,4}\{1,3,4\}。但是由於{1,3,4}\{1,3,4\}的子集{3,4}\{3,4\}不在2-頻繁專案集中,所以需要把{1,3,4}\{1,3,4\}剔除掉。

生成強規則

  得到頻繁專案集之後,則需要從頻繁專案集中找出符合條件的強關聯規則。最簡單的辦法是:遍歷所有的頻繁專案集,然後從每個專案集中依次取12k1、2、\cdots k個元素作為後件,該專案集中的其他元素作為前件,計算該規則的置信度進行篩選即可。這樣的窮舉效率顯然很低。假如對於一個頻繁專案集ff,可以生成下面這樣的關聯規則: fββ(f-\beta)\to \beta

那麼這條規則的置信度confidence=f.count/(fβ).countconfidence=f.count/(f-β).count   根據這個置信度計算公式可知,對於一個頻繁專案集f.countf.count是不變的,而假設該規則是強關聯規則,則(fβsub)βsub(f-\beta_{sub})\to \beta_{sub}也是強關聯規則,其中βsub\beta_{sub}β\beta的子集,因為(fβsub).count(f-\beta_{sub}).count肯定小於(fβ).count(f-\beta).count。即給定一個頻繁專案集ff,如果一條強關聯規則的後件為ββ,那麼以ββ的非空子集為後件的關聯規則都是強關聯規則。所以可以先生成所有的1-後件(後件只有一項)強關聯規則,然後再生成2-後件強關聯規則,依次類推(與生成頻繁項集類似),直至生成所有的強關聯規則

一個例子

下面舉例說明Apiori演算法的具體流程: 假如有專案集合I={1,2,3,4,5}I=\{1,2,3,4,5\},有事務集TT

t1:1,2,3
t2:1,2,4
t3:1,3,4
t4:1,2,3,5
t5:1,3,5
t6:2,4,5
t7:1,2,3,4

設定minsup=3/7,minconf=5/7。

首先:生成頻繁專案集:

1-頻繁專案集:{1}{2}{3}{4}{5}\{1\},\{2\},\{3\},\{4\},\{5\}

  生成2-頻繁專案集:   根據1-頻繁專案集生成所有的包含2個元素的專案集:任意取兩個只有最後一個元素不同的1-頻繁專案集,求其並集,由於每個1-頻繁專案集元素只有一個,所以生成的專案集如下:

{1,2}{1,3}{1,4}{1,5}\{1,2\},\{1,3\},\{1,4\},\{1,5\}