概念:
對於頻繁模式挖掘,有兩個基本的概念:
support: support = P(A,B)
confidence: confidence = P(A|B) = support/P(B)
存儲:
在頻繁模式挖掘算法中,我們每一輪在計算所有k項集時,本來要用k維數組,可以考慮只用一維數組來存k維數組。例如用a[k] 來存a[i][j] , k= (i-1)(n-i/2)+j-i , 比較實用的方法是採用<i,j>->count的Hash方式,或者說是利用<x,y,count>來存儲二項集。
算法:
Apriori算法:
先決條件:transaction數據中,每個transaction的所有item都按字母序排序
1. 先掃描transaction,找出所有count>support的單個item,作爲1項集
2. 對於所有1項集,拼成2項集
3. 掃描transaction,將不滿足count>support的2項集剪枝掉
4. 對於已剪枝的k-1項集,如果兩個k-1項的前k-2項相同,則合併爲k項集
5. 對k項集再進行剪枝,再合併。。。再剪枝。。。
問題:
對於每次剪枝來說,例如對k項集進行剪枝,對於每個k項集,都要掃描所有的transaction!來計算其count,由於transaction往往較大,不可能存在內存中,所有這個過程很慢,特別是當k項集很多時
優化策略:
1. Hash 策略:(PCY algorithm)
1).在掃描k-1項集(對k-1項集進行計數)的時候,將所有k項集Hash到N個桶中,並不一定真的存在桶中,只是對桶的計數+1。
2).如果桶n計數<support,擋下一輪選k項集時,所有Hash到桶n的k項集都被拋棄,這樣就減少了掃描整個transaction個數的次數。
問題:桶的個數很難確定,太小的話,沒有效果,太多的話比較佔內存
Multistage:
在2)後再做一下工作,首先根據k-1項集的count,對所有k-1判斷是否爲頻繁項集,然後再做一次Hash,將滿足下列條件的k-1項集Hash到新的桶中:
a.此k-1項集爲頻繁項集
b. 此k-1項集在頻繁的桶中(count>support)
然後將在原頻繁桶卻不在新頻繁桶中的k-1項集裁減掉
2.Transaction Reduction
對於沒有滿足條件的k-1項集的transaction,肯定也沒有滿足條件的k項集,所有可以對其標記,以後不再掃描。
問題:對於transaction存在磁盤上的情況,即使標記某行不被讀取,性能提升可能也不大。
3. SON Algorithm
假設support爲s將所有transaction分爲N個partition,對每個partition做內存版的apriori算法(或Multistage), 其局部的support維s/N, 將所有partition計算出的局部頻繁項集作爲候選全局頻繁項集,然後對所有候選集,做一次全局遍歷。得到其count,判斷是否爲全局頻繁項集。
SONAlgorithm可以寫成MapReduce版本分佈式計算。
應用:對於某些數據,可以根據時間或地點進行partition,然後每個partition進行計算頻繁項集。但是有些情況下其實並沒有必要做全局的頻繁項集合並,因爲其推導出的關聯規則也就是局部的,基於時間地點的去使用,所以局部的頻繁項集就足夠了。
FP-Tree:
算法:
1. 首先掃描全部transaction,記錄每個item的count,並重寫全部transaction,使得新的數據集中每個transaction中的item按count從大到小排序(這一步可以先將count<support的item剪枝掉)
2. 用新的transaction數據集建立FP-tree,先有一個NULL的root結點,每個transaction都按item的count從大到小的順序從父親到孩子,每個節點count=1,父親結點與之前的transaction重複的就共享之前的父親結點,將其count+1.
3. 對所有item,按count從小到大的順序進行挖掘,找到其所有到root的的路徑,將每個路徑分析出以此item結尾的頻繁項集。
FP-tree無需多次掃描硬盤的transaction數據,比Apriori快很多,但當數據量很大時,內存中建立FP-tree會有問題,FP-tree的大小遠大於item個數,但要小於transaction數據。
但其實當support設的較高時,Apriori輪數也較少,如果可以通過partition或抽樣放到內存中計算,速度應該不次於FP-Tree。
Vertical Format Mining
算法:
1. 掃描所有transaction數據,將transactionnumber-> item number list 轉換爲item number -> transaction number list
2. 轉換好的item number -> transaction number list 可以看做一項集,對其進行剪枝
3. 對不同的item number -> transaction number list 做交操作,得到item number 二項集-> transaction number list
4. 再交得到 三項集,四項集等等
算法總結:分佈式處理,將數據都放入內存計算纔是王道!Apriori算法看起來是最容易分佈式處理的,而且彼此node之間很少有交互,節省了網絡傳輸。FP-Tree也有相應的分佈式處理方法,待以後研究。而Vertical Format Mining由於要與每個transaction交,所以很難做分佈式。
頻繁模式挖掘的作用: 由頻繁模式推斷出關聯規則
假使J是頻繁n項集。j是其中任意一個item,因此所有n個(J-j)也都是頻繁項集(n-1項集)
所以共有n個候選的關聯規則:
(J-j) ->j
support = P(j, J-j) = P(J)
confidence = P(j|J-j) = P(j, J-j)/P(J-j) = support/P(J-j)
可見對於每個關聯規則來說support是相同的,confidence各不相同。
所以將這n個候選按confidence進行篩選
一般情況下關聯規則不宜太多,所以support threshold應該設的高一些,一般爲transaction個數的1%。