PrefixSpan算法原理总结
前面我們講到頻繁項(xiàng)集挖掘的關(guān)聯(lián)算法Apriori和FP Tree。這兩個(gè)算法都是挖掘頻繁項(xiàng)集的。而今天我們要介紹的PrefixSpan算法也是關(guān)聯(lián)算法,但是它是挖掘頻繁序列模式的,因此要解決的問題目標(biāo)稍有不同。
一、1.?項(xiàng)集數(shù)據(jù)和序列數(shù)據(jù)
首先我們看看項(xiàng)集數(shù)據(jù)和序列數(shù)據(jù)有什么不同,如下圖所示。
左邊的數(shù)據(jù)集就是項(xiàng)集數(shù)據(jù),在Apriori和FP Tree算法中我們也已經(jīng)看到過了,每個(gè)項(xiàng)集數(shù)據(jù)由若干項(xiàng)組成,這些項(xiàng)沒有時(shí)間上的先后關(guān)系。而右邊的序列數(shù)據(jù)則不一樣,它是由若干數(shù)據(jù)項(xiàng)集組成的序列。比如第一個(gè)序列<;a(abc)(ac)d(cf)>;,它由a,abc,ac,d,cf共5個(gè)項(xiàng)集數(shù)據(jù)組成,并且這些項(xiàng)有時(shí)間上的先后關(guān)系。對(duì)于多于一個(gè)項(xiàng)的項(xiàng)集我們要加上括號(hào),以便和其他的項(xiàng)集分開。同時(shí)由于項(xiàng)集內(nèi)部是不區(qū)分先后順序的,為了方便數(shù)據(jù)處理,我們一般將序列數(shù)據(jù)內(nèi)所有的項(xiàng)集內(nèi)部按字母順序排序。
二、子序列與頻繁序列
了解了序列數(shù)據(jù)的概念,我們?cè)賮?lái)看看上面是子序列。子序列和我們數(shù)學(xué)上的子集的概念很類似,也就是說(shuō),如果某個(gè)序列A所有的項(xiàng)集在序列B中的項(xiàng)集都可以找到,則A就是B的子序列。當(dāng)然,如果用嚴(yán)格的數(shù)學(xué)描述,子序列是這樣的:
對(duì)于序列A={\(a_1,a_2,...a_n\)}和序列B={\(b_1,b_2,...b_m\)},\(n \leq m\),如果存在數(shù)字序列\(1 \leq j_1 \leq j_2 \leq ... \leq j_n \leq m\), 滿足$a_1 \subseteq b_{j_1}, a_2 \subseteq b_{j_2}...a_n \subseteq b_{j_n} $,則稱A是B的子序列。當(dāng)然反過來(lái)說(shuō), B就是A的超序列。
而頻繁序列則和我們的頻繁項(xiàng)集很類似,也就是頻繁出現(xiàn)的子序列。比如對(duì)于下圖,支持度閾值定義為50%,也就是需要出現(xiàn)兩次的子序列才是頻繁序列。而子序列<;(ab)c>;是頻繁序列,因?yàn)樗菆D中的第一條數(shù)據(jù)和第三條序列數(shù)據(jù)的子序列,對(duì)應(yīng)的位置用藍(lán)色標(biāo)示。
三、PrefixSpan算法的一些概念
? PrefixSpan算法的全稱是Prefix-Projected Pattern Growth,即前綴投影的模式挖掘。里面有前綴和投影兩個(gè)詞。那么我們首先看看什么是PrefixSpan算法中的前綴prefix。
在PrefixSpan算法中的前綴prefix通俗意義講就是序列數(shù)據(jù)前面部分的子序列。比如對(duì)于序列數(shù)據(jù)B=<;a(abc)(ac)d(cf)>;,而A=<;a(abc)a>;,則A是B的前綴。當(dāng)然B的前綴不止一個(gè),比如<;a>;, <;aa>;, <;a(ab)>; 也都是B的前綴。
看了前綴,我們?cè)賮?lái)看前綴投影,其實(shí)前綴投影這兒就是我們的后綴,有前綴就有后綴嘛。前綴加上后綴就可以構(gòu)成一個(gè)我們的序列。下面給出前綴和后綴的例子。對(duì)于某一個(gè)前綴,序列里前綴后面剩下的子序列即為我們的后綴。如果前綴最后的項(xiàng)是項(xiàng)集的一部分,則用一個(gè)“_”來(lái)占位表示。
下面這個(gè)例子展示了序列<;a(abc)(ac)d(cf)>;的一些前綴和后綴,還是比較直觀的。要注意的是,如果前綴的末尾不是一個(gè)完全的項(xiàng)集,則需要加一個(gè)占位符。
在PrefixSpan算法中,相同前綴對(duì)應(yīng)的所有后綴的結(jié)合我們稱為前綴對(duì)應(yīng)的投影數(shù)據(jù)庫(kù)。
四、PrefixSpan算法思想
現(xiàn)在我們來(lái)看看PrefixSpan算法的思想,PrefixSpan算法的目標(biāo)是挖掘出滿足最小支持度的頻繁序列。那么怎么去挖掘出所有滿足要求的頻繁序列呢?;貞汚prior算法,它是從頻繁1項(xiàng)集出發(fā),一步步的挖掘2項(xiàng)集,直到最大的K項(xiàng)集。PrefixSpan算法也類似,它從長(zhǎng)度為1的前綴開始挖掘序列模式,搜索對(duì)應(yīng)的投影數(shù)據(jù)庫(kù)得到長(zhǎng)度為1的前綴對(duì)應(yīng)的頻繁序列,然后遞歸的挖掘長(zhǎng)度為2的前綴所對(duì)應(yīng)的頻繁序列,。。。以此類推,一直遞歸到不能挖掘到更長(zhǎng)的前綴挖掘?yàn)橹埂?/p>
比如對(duì)應(yīng)于我們第二節(jié)的例子,支持度閾值為50%。里面長(zhǎng)度為1的前綴包括<;a>;, <;b>;, <;c>;, <;d>;, <;e>;, <;f>;,<;g>;我們需要對(duì)這6個(gè)前綴分別遞歸搜索找各個(gè)前綴對(duì)應(yīng)的頻繁序列。如下圖所示,每個(gè)前綴對(duì)應(yīng)的后綴也標(biāo)出來(lái)了。由于g只在序列4出現(xiàn),支持度計(jì)數(shù)只有1,因此無(wú)法繼續(xù)挖掘。我們的長(zhǎng)度為1的頻繁序列為<;a>;, <;b>;, <;c>;, <;d>;, <;e>;,<;f>;。去除所有序列中的g,即第4條記錄變成<;e(af)cbc>;
現(xiàn)在我們開始挖掘頻繁序列,分別從長(zhǎng)度為1的頻繁項(xiàng)開始。這里我們以d為例子來(lái)遞歸挖掘,其他的節(jié)點(diǎn)遞歸挖掘方法和D一樣。方法如下圖,首先我們對(duì)d的后綴進(jìn)行計(jì)數(shù),得到{a:1, b:2, c:3, d:0, e:1, f:1,_f:1}。注意f和_f是不一樣的,因?yàn)榍罢呤窃诤颓熬Yd不同的項(xiàng)集,而后者是和前綴d同項(xiàng)集。由于此時(shí)a,d,e,f,_f都達(dá)不到支持度閾值,因此我們遞歸得到的前綴為d的2項(xiàng)頻繁序列為<;db>;和<;dc>;。接著我們分別遞歸db和dc為前綴所對(duì)應(yīng)的投影序列。首先看db前綴,此時(shí)對(duì)應(yīng)的投影后綴只有<;_c(ae)>;,此時(shí)_c,a,e支持度均達(dá)不到閾值,因此無(wú)法找到以db為前綴的頻繁序列。現(xiàn)在我們來(lái)遞歸另外一個(gè)前綴dc。以dc為前綴的投影序列為<;_f>;, <;(bc)(ae)>;, <;b>;,此時(shí)我們進(jìn)行支持度計(jì)數(shù),結(jié)果為{b:2, a:1, c:1, e:1, _f:1},只有b滿足支持度閾值,因此我們得到前綴為dc的三項(xiàng)頻繁序列為<;dcb>;。我們繼續(xù)遞歸以<;dcb>;為前綴的頻繁序列。由于前綴<;dcb>;對(duì)應(yīng)的投影序列<;(_c)ae>;支持度全部不達(dá)標(biāo),因此不能產(chǎn)生4項(xiàng)頻繁序列。至此以d為前綴的頻繁序列挖掘結(jié)束,產(chǎn)生的頻繁序列為<;d>;<;db>;<;dc>;<;dcb>;。
同樣的方法可以得到其他以<;a>;, <;b>;, <;c>;, <;e>;, <;f>;為前綴的頻繁序列。
五、PrefixSpan算法流程
下面我們對(duì)PrefixSpan算法的流程做一個(gè)歸納總結(jié)。
輸入:序列數(shù)據(jù)集S和支持度閾值\(\alpha\)
輸出:所有滿足支持度要求的頻繁序列集
1)找出所有長(zhǎng)度為1的前綴和對(duì)應(yīng)的投影數(shù)據(jù)庫(kù)
2)對(duì)長(zhǎng)度為1的前綴進(jìn)行計(jì)數(shù),將支持度低于閾值\(\alpha\)的前綴對(duì)應(yīng)的項(xiàng)從數(shù)據(jù)集S刪除,同時(shí)得到所有的頻繁1項(xiàng)序列,i=1.
3)對(duì)于每個(gè)長(zhǎng)度為i滿足支持度要求的前綴進(jìn)行遞歸挖掘:
a) 找出前綴所對(duì)應(yīng)的投影數(shù)據(jù)庫(kù)。如果投影數(shù)據(jù)庫(kù)為空,則遞歸返回。
b) 統(tǒng)計(jì)對(duì)應(yīng)投影數(shù)據(jù)庫(kù)中各項(xiàng)的支持度計(jì)數(shù)。如果所有項(xiàng)的支持度計(jì)數(shù)都低于閾值\(\alpha\),則遞歸返回。
c) 將滿足支持度計(jì)數(shù)的各個(gè)單項(xiàng)和當(dāng)前的前綴進(jìn)行合并,得到若干新的前綴。
d) 令i=i+1,前綴為合并單項(xiàng)后的各個(gè)前綴,分別遞歸執(zhí)行第3步。
六、PrefixSpan算法小結(jié)
PrefixSpan算法由于不用產(chǎn)生候選序列,且投影數(shù)據(jù)庫(kù)縮小的很快,內(nèi)存消耗比較穩(wěn)定,作頻繁序列模式挖掘的時(shí)候效果很高。比起其他的序列挖掘算法比如GSP,FreeSpan有較大優(yōu)勢(shì),因此是在生產(chǎn)環(huán)境常用的算法。
PrefixSpan運(yùn)行時(shí)最大的消耗在遞歸的構(gòu)造投影數(shù)據(jù)庫(kù)。如果序列數(shù)據(jù)集較大,項(xiàng)數(shù)種類較多時(shí),算法運(yùn)行速度會(huì)有明顯下降。因此有一些PrefixSpan的改進(jìn)版算法都是在優(yōu)化構(gòu)造投影數(shù)據(jù)庫(kù)這一塊。比如使用偽投影計(jì)數(shù)。
當(dāng)然使用大數(shù)據(jù)平臺(tái)的分布式計(jì)算能力也是加快PrefixSpan運(yùn)行速度一個(gè)好辦法。比如Spark的MLlib就內(nèi)置了PrefixSpan算法。
不過scikit-learn始終不太重視關(guān)聯(lián)算法,一直都不包括這一塊的算法集成,這就有點(diǎn)落伍了。
?
(歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。歡迎溝通交流: 微信:nickchen121)
轉(zhuǎn)載于:https://www.cnblogs.com/nickchen121/p/11214773.html
總結(jié)
以上是生活随笔為你收集整理的PrefixSpan算法原理总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模之模型预测
- 下一篇: java程序cpu突然飚高_简单排查ja