PrefixSpan演算法原理總結

2021-08-07 18:04:38 字數 3416 閱讀 8860

原文:

前面我們講到頻繁項集挖掘的關聯演算法apriori和fp tree。這兩個演算法都是挖掘頻繁項集的。而今天我們要介紹的prefixspan演算法也是關聯演算法,但是它是挖掘頻繁序列模式的,因此要解決的問題目標稍有不同。

首先我們看看項集資料和序列資料有什麼不同,如下圖所示。

左邊的資料集就是項集資料,在apriori和fp tree演算法中我們也已經看到過了,每個項集資料由若干項組成,這些項沒有時間上的先後關係。而右邊的序列資料則不一樣,它是由若干資料項集組成的序列。比如第乙個序列,它由a,abc,ac,d,cf共5個項集資料組成,並且這些項有時間上的先後關係。對於多於乙個項的項集我們要加上括號,以便和其他的項集分開。同時由於項集內部是不區分先後順序的,為了方便資料處理,我們一般將序列資料內所有的項集內部按字母順序排序。

了解了序列資料的概念,我們再來看看上面是子串行。子串行和我們數學上的子集的概念很類似,也就是說,如果某個序列a所有的項集在序列b中的項集都可以找到,則a就是b的子串行。當然,如果用嚴格的數學描述,子串行是這樣的:

對於序列a=和序列b=,n≤

m n≤m

,如果存在數字序列1≤

j1≤j

2≤..

.≤jn

≤m1≤j1≤j2≤...≤jn≤m

, 滿足a1

⊆bj1

,a2⊆

bj2.

..an

⊆bjn

a1⊆bj1,a2⊆bj2...an⊆bjn

,則稱a是b的子串行。當然反過來說, b就是a的超序列。

而頻繁序列則和我們的頻繁項集很類似,也就是頻繁出現的子串行。比如對於下圖,支援度閾值定義為50%,也就是需要出現兩次的子串行才是頻繁序列。而子串行是頻繁序列,因為它是圖中的第一條資料和第三條序列資料的子串行,對應的位置用藍色標示。

prefixspan演算法的全稱是prefix-projected pattern growth,即字首投影的模式挖掘。裡面有字首和投影兩個詞。那麼我們首先看看什麼是prefixspan演算法中的字首prefix。

在prefixspan演算法中的字首prefix通俗意義講就是序列資料前面部分的子串行。如果用嚴格的數學描述,字首是這樣的:對於序列a=和序列b=,n≤

m n≤m

,滿足a1=

b1,a

2=b2

...a

n−1=

bn−1

a1=b1,a2=b2...an−1=bn−1,而a

n⊆bn

an⊆bn

,則稱a是b的字首。比如對於序列資料b=,而a=,則a是b的字首。當然b的字首不止乙個,比如, , 也都是b的字首。

看了字首,我們再來看字首投影,其實字首投影這兒就是我們的字尾,有字首就有字尾嘛。字首加上字尾就可以構成乙個我們的序列。下面給出字首和字尾的例子。對於某乙個字首,序列裡字首後面剩下的子串行即為我們的字尾。如果字首最後的項是項集的一部分,則用乙個「_」來佔位表示。

下面這個例子展示了序列的一些字首和字尾,還是比較直觀的。要注意的是,如果字首的末尾不是乙個完全的項集,則需要加乙個佔位符。

在prefixspan演算法中,相同字首對應的所有字尾的結合我們稱為字首對應的投影資料庫。

現在我們來看看prefixspan演算法的思想,prefixspan演算法的目標是挖掘出滿足最小支援度的頻繁序列。那麼怎麼去挖掘出所有滿足要求的頻繁序列呢。回憶aprior演算法,它是從頻繁1項集出發,一步步的挖掘2項集,直到最大的k項集。prefixspan演算法也類似,它從長度為1的字首開始挖掘序列模式,搜尋對應的投影資料庫得到長度為1的字首對應的頻繁序列,然後遞迴的挖掘長度為2的字首所對應的頻繁序列,。。。以此類推,一直遞迴到不能挖掘到更長的字首挖掘為止。

現在我們開始挖掘頻繁序列,分別從長度為1的字首開始。這裡我們以d為例子來遞迴挖掘,其他的節點遞迴挖掘方法和d一樣。方法如下圖,首先我們對d的字尾進行計數,得到。注意f和_f是不一樣的,因為前者是在和字首d不同的項集,而後者是和字首d同項集。由於此時a,d,e,f,_f都達不到支援度閾值,因此我們遞迴得到的字首為d的2項頻繁序列為和。接著我們分別遞迴db和dc為字首所對應的投影序列。首先看db字首,此時對應的投影字尾只有<_c>,此時_c,a,e支援度均達不到閾值,因此無法找到以db為字首的頻繁序列。現在我們來遞迴另外乙個字首dc。以dc為字首的投影序列為<_f>, ,,此時我們進行支援度計數,結果為,只有b滿足支援度閾值,因此我們得到字首為dc的三項頻繁序列為。我們繼續遞迴以為字首的頻繁序列。由於字首對應的投影序列支援度全部不達標,因此不能產生4項頻繁序列。至此以d為字首的頻繁序列挖掘結束,產生的頻繁序列為。

同樣的方法可以得到其他以,, , , 為字首的頻繁序列。

下面我們對prefixspan演算法的流程做乙個歸納總結。

輸入:序列資料集s和支援度閾值

α α

輸出:所有滿足支援度要求的頻繁序列集

1)找出所有長度為1的字首和對應的投影資料庫

2)對長度為1的字首進行計數,將支援度低於閾值

α α

的字首對應的項從資料集s刪除,同時得到所有的頻繁1項序列,i=1.

3)對於每個長度為i滿足支援度要求的字首進行遞迴挖掘:

a) 找出字首所對應的投影資料庫。如果投影資料庫為空,則遞迴返回。

b) 統計對應投影資料庫中各項的支援度計數。如果所有項的支援度計數都低於閾值

α α

,則遞迴返回。

c) 將滿足支援度計數的各個單項和當前的字首進行合併,得到若干新的字首。

d) 令i=i+1,字首為合併單項後的各個字首,分別遞迴執行第3步。

prefixspan演算法由於不用產生候選序列,且投影資料庫縮小的很快,記憶體消耗比較穩定,作頻繁序列模式挖掘的時候效果很高。比起其他的序列挖掘演算法比如gsp,freespan有較大優勢,因此是在生產環境常用的演算法。

prefixspan執行時最大的消耗在遞迴的構造投影資料庫。如果序列資料集較大,項數種類較多時,演算法執行速度會有明顯下降。因此有一些prefixspan的改進版演算法都是在優化構造投影資料庫這一塊。比如使用偽投影計數。

當然使用大資料平台的分布式計算能力也是加快prefixspan執行速度乙個好辦法。比如spark的mllib就內建了prefixspan演算法。

不過scikit-learn始終不太重視關聯演算法,一直都不包括這一塊的演算法整合,這就有點落伍了。

PrefixSpan演算法原理總結

前面我們講到頻繁項集挖掘的關聯演算法apriori和fp tree。這兩個演算法都是挖掘頻繁項集的。而今天我們要介紹的prefixspan演算法也是關聯演算法,但是它是挖掘頻繁序列模式的,因此要解決的問題目標稍有不同。首先我們看看項集資料和序列資料有什麼不同,如下圖所示。左邊的資料集就是項集資料,在...

PrefixSpan演算法原理總結

前面我們講到頻繁項集挖掘的關聯演算法apriori和fp tree。這兩個演算法都是挖掘頻繁項集的。而今天我們要介紹的prefixspan演算法也是關聯演算法,但是它是挖掘頻繁序列模式的,因此要解決的問題目標稍有不同。首先我們看看項集資料和序列資料有什麼不同,如下圖所示。左邊的資料集就是項集資料,在...

PrefixSpan演算法詳解

一 序列模式挖掘簡介 序列模式的概念最早是由agrawal和srikant 提出的。動機 大型連鎖超市的交易資料有一系列的使用者事務資料庫,每一條記錄包括使用者的id,事務發生的時間和事務涉及的專案。如果能在其中挖掘涉及事務間關聯關係的模式,即使用者幾次購買行為間的聯絡,可以採取更有針對性的營銷措施...