這前兩個算法真是出人意料地好理解
GSP算法是APRioriAll算法的擴展算法,其算法的執行過程和AprioriAll類似。
其核心思想是:在每一次掃描(pass)數據庫時,利用上一次掃描時產生的大序列生成候選序列,并在掃描的同時計算它們的支持度(support),滿足支持度的候選序列作為下次掃描的大序列。第1次掃描時,長度為1的頻繁序列模式作為初始的大1—序列。
接下來會演示一下GSP如何產生候選集的。
GSP算法最大的特點就在于,GSP引入了時間約束、滑動時間窗和分類層次技術,增加了掃描的約束條件,有效地減少了需要掃描的候選序列的數量,同時還克服了基本序列模型的局限性,更切合實際,減少多余的無用模式的產生。
另外GSP利用哈希樹來存儲候選序列,減小了需要掃描的序列數量,同時對數據序列的表示方法進行轉換,這樣就可以有效地發現一個侯選項是否是數據序列的子序列。
但是這些方法都不算是GSP的核心思想,只是一些剪枝的優化而已,與其他很多算法的方式極其類似,無論是ACM-ICPC還是其他機器學習、深度學習的算法都有類似的優化,所以不再贅述。
我們現在有如下的數據庫,并設置最小支持度min_support = 2

我們先進行第一次掃描。
得到如下的序列

這全部的就是候選集,然后沒有打叉的就是序列模式。這里的思想和之前講過的Apriori算法完全一樣。
現在我們來產生長度為2的候選集,只是候選集而已。

我們來稍微解釋一下,如

這里就不存在類似于
我們這里總共產生了候選集
如果沒有使用剪枝,而是直接使用類似于廣度優先搜索(bfs)的算法生成,則會有
然后再進行篩選,直到不能進行了為止。

使用數據結構對序列進行存儲能夠方便管理,節約空間。就有一些類似蛤夫曼樹壓縮編碼那樣。
GSP采用哈希樹存儲候選序列模式。哈希樹的節點分為三類:
根節點;內部節點;葉子節點。根節點和內部節點中存放的是一個哈希表,每個哈希表項指向其它的節點。而葉子節點內存放的是一組候選序列模式。

代碼請見
SPADE算法依舊使用傳統的先驗性質,即連接步+剪枝步的經典組合,思想跟GSP大致相同,但是引入了垂直列表數據庫。
SPADE算法尋找1-序列和2-序列頻繁項集方法跟GSP完全形同,在之后的3-候選集及之后的頻繁項計算中,采取了一種“作弊”的辦法獲得候選集,該辦法套用了三種屢試不爽的公式,如下:
如果諸如成員PA,PD這樣的形式出現在2頻繁項集中,則能推導出PBD這樣的三成員元素。 如果出現諸如PB,P->A這樣的形式出現在2頻繁項集中,則能推導出PB->A這樣的三成員元素。 如果出現諸如P->A,P->F這樣的形式出現在2頻繁項集中,則能推導出P->AF或P->A->F或P->F->A這樣的三成員元素。同時還要注意,如果想要A和F得出AF,那么A發生的序列號要與F發生的序列號相同,而且A的時間序列號要小于F的時間序列號。想相反的情況也是一樣的,要得出FA,則要F的時間序列號要小于A的時間序列號。
現有如下的數據庫

其中時間序列號(或稱為元素序列號)表示在一個序列中排序的位置,因為越大的排序在越后面。
在本例中AB,AF是兩個頻繁的2成員項,那么有可能存在且僅存在ABF這樣的3成員頻繁項,經過10次計算遍歷了一遍data發現ABF確實是頻繁的。

然后這樣也是一點一點做直到沒有辦法。
算法思想:采用分治的思想,不斷產生序列數據庫的多個更小的投影數據庫,然后在各個投影數據庫上進行序列模式挖掘。
前綴:設每個元素中的所有項目按照字典序排列。給定序列
例:序列
投影:給定序列
后綴:序列
投影數據庫:設
投影數據庫中的支持度:設

1-序列都是一如既往地計算。
然后就根據每一個1-序列得出對應的投影數據庫
再結合每一個投影數據庫中序列的前綴,從而得到2-序列。
用來計算閉合序列模式的方法,大家可以看看論文。
閉合序列模式
其中
用兩種算法Backward Subpattern和Backward Superpattern來合并數據庫,實現Clospan。
論文:Greatly enhances efficiency (Yan, et al., SDM’03)
如果大家看到MathJax的公式最后都有一個奇怪的豎線,應該是CSDN自己的解析出現了問題,看起來確實挺奇怪的。
新聞熱點
疑難解答