頻繁模式挖掘 Apriori
原文地址:http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html
1. 挖掘關聯規則
1.1 什麼是關聯規則
一言蔽之,關聯規則是形如X→Y的蘊涵式,表示通過X可以推導“得到”Y,其中X和Y分別稱為關聯規則的先導(antecedent或left-hand-side, LHS)和後繼(consequent或right-hand-side, RHS)
1.2 如何量化關聯規則
關聯規則挖掘的一個典型例子便是購物車分析。通過關聯規則挖掘能夠發現顧客放入購物車中的不同商品之間的關聯,分析顧客的消費習慣。這種關聯規則的方向能夠幫助賣家瞭解哪些商品被顧客頻繁購買,從而幫助他們開發更好的營銷策略。比如:將經常同時購買的商品擺近一些,以便進一步刺激這些商品一起銷售;或者,將兩件經常同時購買的商品擺遠一點,這樣可能誘發買這兩件商品的使用者一路挑選其他商品。
在資料探勘當中,通常用“支援度”(support)和“置性度”(confidence)兩個概念來量化事物之間的關聯規則。它們分別反映所發現規則的有用性和確定性。比如:
Computer => antivirus_software , 其中 support=2%, confidence=60%
表示的意思是所有的商品交易中有2%的顧客同時買了電腦和防毒軟體,並且購買電腦的顧客中有60%也購買了防毒軟體。在關聯規則的挖掘過程中,通常會設定最小支援度閾值和最小置性度閾值,如果某條關聯規則滿足最小支援度閾值和最小置性度閾值,則認為該規則可以給使用者帶來感興趣的資訊。
1.3
1)幾個基本概念:
關聯規則A->B的支援度support=P(AB),指的是事件A和事件B同時發生的概率。
置信度confidence=P(B|A)=P(AB)/P(A),指的是發生事件A的基礎上發生事件B的概率。
同時滿足最小支援度閾值和最小置信度閾值的規則稱為強規則。
如果事件A中包含k個元素,那麼稱這個事件A為k項集,並且事件A滿足最小支援度閾值的事件稱為頻繁k項集。
2)挖掘過程:
第一,找出所有的頻繁項集;
第二,由頻繁項集產生強規則。
2. 什麼是Apriori
2.1 Apriori介紹
Apriori
其中,Apriori演算法具有這樣一條性質:任一頻繁項集的所有非空子集也必須是頻繁的。因為假如P(I)< 最小支援度閾值,當有元素A新增到I中時,結果項集(A∩I)不可能比I出現次數更多。因此A∩I也不是頻繁的。
2.2 連線步和剪枝步
在上述的關聯規則挖掘過程的兩個步驟中,第一步往往是總體效能的瓶頸。Apriori演算法採用連線步和剪枝步兩種方式來找出所有的頻繁項集。
1) 連線步
為找出Lk(所有的頻繁k項集的集合),通過將Lk-1(所有的頻繁k-1項集的集合)與自身連線產生候選k項集的集合。候選集合記作Ck。設l1和l2是Lk-1中的成員。記li[j]表示li中的第j項。假設Apriori演算法對事務或項集中的項按字典次序排序,即對於(k-1)項集li,li[1]<li[2]<……….<li[k-1]。將Lk-1與自身連線,如果(l1[1]=l2[1])&&( l1[2]=l2[2])&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1]),那認為l1和l2是可連線。連線l1和l2 產生的結果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}。
2) 剪枝步
CK是LK的超集,也就是說,CK的成員可能是也可能不是頻繁的。通過掃描所有的事務(交易),確定CK中每個候選的計數,判斷是否小於最小支援度計數,如果不是,則認為該候選是頻繁的。為了壓縮Ck,可以利用Apriori性質:任一頻繁項集的所有非空子集也必須是頻繁的,反之,如果某個候選的非空子集不是頻繁的,那麼該候選肯定不是頻繁的,從而可以將其從CK中刪除。
(Tip:為什麼要壓縮CK呢?因為實際情況下事務記錄往往是儲存在外儲存上,比如資料庫或者其他格式的檔案上,在每次計算候選計數時都需要將候選與所有事務進行比對,眾所周知,訪問外存的效率往往都比較低,因此Apriori加入了所謂的剪枝步,事先對候選集進行過濾,以減少訪問外存的次數。)
2.3 Apriori演算法例項
交易ID |
商品ID列表 |
T100 |
I1,I2,I5 |
T200 |
I2,I4 |
T300 |
I2,I3 |
T400 |
I1,I2,I4 |
T500 |
I1,I3 |
T600 |
I2,I3 |
T700 |
I1,I3 |
T800 |
I1,I2,I3,I5 |
T900 |
I1,I2,I3 |
上圖為某商場的交易記錄,共有9個事務,利用Apriori演算法尋找所有的頻繁項集的過程如下:
詳細介紹下候選3項集的集合C3的產生過程:從連線步,首先C3={{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}(C3是由L2與自身連線產生)。根據Apriori性質,頻繁項集的所有子集也必須頻繁的,可以確定有4個候選集{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}不可能時頻繁的,因為它們存在子集不屬於頻繁集,因此將它們從C3中刪除。注意,由於Apriori演算法使用逐層搜尋技術,給定候選k項集後,只需檢查它們的(k-1)個子集是否頻繁。
3. Apriori虛擬碼
演算法:Apriori 輸入:D - 事務資料庫;min_sup - 最小支援度計數閾值 輸出:L - D中的頻繁項集 |