之前一直接觸的都是頻繁模式挖掘比如Aprior或者FP-GROWTH,偶然需要用到時間序列的頻繁模式挖掘,也就是事件的發生不再是無序的,而是有序的發生,看到兩篇博客寫的很清楚:
http://www.cnblogs.com/pinard/p/6323182.html
http://www.cnblogs.com/pinard/p/6340162.html
序列模式挖掘就是找出頻繁的subsquences,什么是subsequences?例如<a(bc)dc>是a(abc)(ac)d(cf)的subsquences。只要按照順序出現的。需要找到出現次數超過閾值的subsequences。
有人利用aprior的反單調性,就有個算法GSP(Generalized Sequential Pattern)是Agrawal and Srikant提出,利用一個頻繁序列它的子序列肯定是頻繁的,不頻繁的序列任何超集都是不頻繁的。跟關聯規則算法類似,數長度為1的sequence, 掃描數據,找到頻繁1項序列,然后產生長度為2的sequence,然后再掃描數據庫,看哪些是真正的sequence,哪些不是,重復以上,知道沒有新的sequence.
g和h只出現一次,不滿足最小支持度,所以去掉

形成長度為2的candidates,這時候會因為有順序的關系,會產生51個candidates(兩兩組合6*6再加上另一個兩兩調換順序的15個,一共51)而不是像關聯規則是15個了。之后再依次形成長度為3、4。。的candidates,和關聯規則是一樣的。尤其是在長序列挖掘的時候,工作量太大了。

parallel sequence minning肯定是需要的。CCPD多個process共享一個大的內存,supoort counting的那個hash tree都在內存里,但需要內存非常大,問題還是沒解決。
event distribution,數據橫着砍很多刀,每個process負責一部分數數,每台機器在自己的hash tree里面數,哪些subsequence出現了多少次,計數,每個process都數完了以后做一個global reduction MPI,master process就能得到哪些是真正的頻繁集,哪些不是。然后廣播出去,利用k頻繁的序列產生K+1的candidates,然后每個process又繼續數數。

但不管是上面怎么並行,序列挖掘仍然沒有很好的算法解決,內存消耗太大。Mohammed zaki提出算法SPADE,與eclact如出一轍。划分成不同的子問題,然后讓不同的process去負責一個小的子問題,子問題里面去尋找頻繁集,number of candidates就會小一些。
數據結構用了vertical list(各項集之間取交),通過交集幫助來找sequence的頻率。自頂向下尋找max frequence,基於后綴找,A-->B C-->B 共享后綴B,它就把A和C歸到一個chunck里面
舉例
數據庫如下圖,1 2 5 7等為日期,括號里面的項目順序無所謂。在這個小database里面,我們可以找到一些maximal frequence sequences. AC-->D 3次 AC-->TW 2次 C-->D-->TW 可以把空間划分成為幾塊。

共享后綴suffix-based equivalence calsses,提供了細分的機制。找到長度為2的頻繁序列后,根據共享后綴就可以產生equvience classes,使得各個問題大小盡量相似。
參考文獻 Mohammed J zaki Parallel Sequence Mining on Shared-Memory Machines in journal of Parallel and Distributed Computing special issue on High Performance Data Mining. Volume 61 No.3 pp401-426, March 2001
