1. 程式人生 > >資料探勘中的模式發現(七)GSP演算法、SPADE演算法、PrefixSpan演算法

資料探勘中的模式發現(七)GSP演算法、SPADE演算法、PrefixSpan演算法

這前兩個演算法真是出人意料地好理解

GSP演算法

GSP演算法是AprioriAll演算法的擴充套件演算法,其演算法的執行過程和AprioriAll類似。

其核心思想是:在每一次掃描(pass)資料庫時,利用上一次掃描時產生的大序列生成候選序列,並在掃描的同時計算它們的支援度(support),滿足支援度的候選序列作為下次掃描的大序列。第1次掃描時,長度為1的頻繁序列模式作為初始的大1—序列。

接下來會演示一下GSP如何產生候選集的。

GSP演算法最大的特點就在於,GSP引入了時間約束、滑動時間窗和分類層次技術,增加了掃描的約束條件,有效地減少了需要掃描的候選序列的數量,同時還克服了基本序列模型的侷限性,更切合實際,減少多餘的無用模式的產生。

另外GSP利用雜湊樹來儲存候選序列,減小了需要掃描的序列數量,同時對資料序列的表示方法進行轉換,這樣就可以有效地發現一個侯選項是否是資料序列的子序列。

但是這些方法都不算是GSP的核心思想,只是一些剪枝的優化而已,與其他很多演算法的方式極其類似,無論是ACM-ICPC還是其他機器學習、深度學習的演算法都有類似的優化,所以不再贅述。

演示

我們現在有如下的資料庫,並設定最小支援度min_support = 2

圖1

我們先進行第一次掃描。

得到如下的序列

圖2

這全部的就是候選集,然後沒有打叉的就是序列模式。這裡的思想和之前講過的Apriori演算法完全一樣。

現在我們來產生長度為2的候選集,只是候選集而已。

圖3

我們來稍微解釋一下,如<aa>,這個的意思就是先發生了一次a再發生了一次a,而不是同時發生的。每個a都是一個元素。

圖4

這裡就不存在類似於<(aa)>這樣的序列了,這裡是產生只含有一個元素的序列。

我們這裡總共產生了候選集6×6+6×5÷2=51個。

如果沒有使用剪枝,而是直接使用類似於廣度優先搜尋(bfs)的演算法生成,則會有8×8+8×7÷2=92個。

然後再進行篩選,直到不能進行了為止。

圖6

雜湊樹

使用資料結構對序列進行儲存能夠方便管理,節約空間。就有一些類似蛤夫曼樹壓縮編碼那樣。

GSP採用雜湊樹儲存候選序列模式。雜湊樹的節點分為三類:

  • 根節點;
  • 內部節點;
  • 葉子節點。

根節點和內部節點中存放的是一個雜湊表,每個雜湊表項指向其它的節點。而葉子節點記憶體放的是一組候選序列模式。

圖5

程式碼請見

SPADE演算法

SPADE演算法依舊使用傳統的先驗性質,即連線步+剪枝步的經典組合,思想跟GSP大致相同,但是引入了垂直列表資料庫。

SPADE演算法尋找1-序列和2-序列頻繁項集方法跟GSP完全形同,在之後的3-候選集及之後的頻繁項計算中,採取了一種“作弊”的辦法獲得候選集,該辦法套用了三種屢試不爽的公式,如下:

  1. 如果諸如成員PA,PD這樣的形式出現在2頻繁項集中,則能推匯出PBD這樣的三成員元素。
  2. 如果出現諸如PB,P->A這樣的形式出現在2頻繁項集中,則能推匯出PB->A這樣的三成員元素。
  3. 如果出現諸如P->A,P->F這樣的形式出現在2頻繁項集中,則能推匯出P->AF或P->A->F或P->F->A這樣的三成員元素。

同時還要注意,如果想要A和F得出AF,那麼A發生的序列號要與F發生的序列號相同,而且A的時間序列號要小於F的時間序列號。想相反的情況也是一樣的,要得出FA,則要F的時間序列號要小於A的時間序列號。

演示

現有如下的資料庫

圖7

其中時間序列號(或稱為元素序列號)表示在一個序列中排序的位置,因為越大的排序在越後面。

在本例中AB,AF是兩個頻繁的2成員項,那麼有可能存在且僅存在ABF這樣的3成員頻繁項,經過10次計算遍歷了一遍data發現ABF確實是頻繁的。

圖8

然後這樣也是一點一點做直到沒有辦法。

PrefixSpan

演算法思想:採用分治的思想,不斷產生序列資料庫的多個更小的投影資料庫,然後在各個投影資料庫上進行序列模式挖掘。

相關定義

字首:設每個元素中的所有專案按照字典序排列。給定序列α=<e1e2en>β=<e1e2em>(mn) ,如果ei=ei(im1)emem,並且(emem)中的專案均在em中專案的後面, 則稱βα的字首。

例:序列<(ab)>是序列<(abd)(acd)> 的一個字首;序列<(ad)>則不是。

投影:給定序列αβ ,如果βα的子序列,則α關於β的投影α必須滿足: βα的字首,αα的滿足上述條件的最長子序列
 
例:對於序列α=<(ab)(acd)>,其子序列β=<(b)>的投影是α=<(b)(acd)>; <(ab)>的投影是原序列<(ab)(acd)>

字尾:序列α關於子序列β=<e1e2em1em>的投影為α=<e1e2en>(nm),則序列α關於子序列β的字尾為<e′′mem+1en>, 其中e′′m=(emem)
  
例:對於序列<(ab)(acd)>,其子序列<(b)>的投影是<(b)(acd)>,則