頻繁模式挖掘總結

概念:

         對於頻繁模式挖掘,有兩個基本的概念:

         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%。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章