頻繁序列模式挖掘

2021-06-28 07:29:32 字數 3424 閱讀 8474

序列模式是頻繁模式的一種特殊情況,它們的應用範圍完全不一樣!如:

購買物品

尿布、啤酒、可樂

麵包、尿布、啤酒

上述購物清單是兩個使用者的購物清單,根據上面的清單,我們可以發現尿布和啤酒組合起來一起購買的情況較多,因此超市可以根據這樣的頻繁項集分析,將尿布和啤酒放在較近的地方,或者將尿布和啤酒同時**等增加銷量。

而序列模式如:

u1購買物品

電視高畫質機頂盒

u2購買物品

電視、電冰箱

高畫質機頂盒、冰箱清潔劑

上述購物清單是兩個使用者不同時間前後兩次的購物清單,可以發現高畫質機頂盒往往在某個使用者購買電視機以後的某次購物中出現在下次的購物清單中,但往往很少出現機頂盒在購買電視機之前出現,這是因為電視機的購買歷史帶來了(促進了)機頂盒的銷售,因此超市可以根據這樣的頻繁序列模式分析,將機頂盒推薦給購買了電視的使用者,或者在電視熱賣以後增加機頂盒的**來增加銷量。

很常見的是,我們可以用許多演算法挖掘頻繁模式如apriori和fpgrowth等,而為了對

含有時間順序的資料集進行頻繁模式的挖掘,就有了gsp和spade演算法。

定義:序列模式挖掘,假定資料集d,有n個序列(seq),每個seq由多個事件(event)組成,所有event都是時間有序的。

若有乙個seq,它是資料集d的部分序列的子串行,那麼它的支援度的計算方式為:

support(s) = s在n個序列中出現的次數

如果spport(s)>min_support,則我們可以把它稱為頻繁序列,或者序列模式。下面是兩個常用的挖掘演算法:

gsp演算法其實就是乙個類apriori演算法,它也就兩個步驟:1.進行自連線 2.進行剪枝

序列如何進行自連線呢?有這樣乙個定義,即對於序列s1和s2,如果序列s1去掉第一項,與序列2去掉最後一項得到的序列相同,那麼序列1和序列2就是可以連線的。把序列2的最後一項加入到序列1中,得到乙個新的連線,即可以作為序列1和序列2連線的結果。

gsp演算法的剪枝條件與apriori演算法的剪枝條件相同:

1.如果序列的支援度小於最小支援度,那麼就會被剪掉 

2.如果序列是頻繁序列,則它的所有子串行必定是頻繁序列;

我們假定資料集d有三組序列(sid=1, sid=2, sid=3),並假定min_support=2:

sideid項11

i1,i212

i313i4

sideid項21

i222i3

sideid項31

i232i4

我們首先得到的候選序列為(接下來的表述中,尖括號<>表示裡面的項有序,而圓括號()表示裡面的項是出現在乙個event中):

,,,可以得到它們的支援度分別為:

:1:3

:2:2

進行剪枝,可以得到的序列模式為:

:3:2

:2然後再用前一步得到的序列模式,進行自連線,我們可以得到候選序列:

:0:2

:2:0

:0:1

:0:0

:0(i2,i3):0

(i2,i4):0

(i3,i4):0

進行剪枝,得到的序列模式為:

:2:2

由於去掉第一項得到,與去掉最後一項得到,序列並不相同。所以它們是不能進行連線的,此時演算法終止。最終得到的序列模式即為:

,即如果使用者購買了i2,則很有可能再購買i3;如果使用者購買了i2,則很有可能再購買i4。

gsp演算法很直白,但是也有缺點,就是每次計算序列的支援度時,都需要全表掃瞄資料集d。我們簡單估計一下,假設資料集d的裡面含有m個不同的項。假設第一步得到的單個序列候選集無需進行剪枝,那麼由那個單個序列集合再進行自連線時,得到的序列個數為:m*m+m(m-1)/2個。(m*m個為有序的序列,m(m-1)/2為同時出現在某乙個event的序列個數),那麼此時需要進行的資料集d的掃瞄次數=(m*m+m(m-1)/2)*資料集d的記錄數。一次候選集剪枝的全資料集d的掃瞄次數都非常之大。

針對上面的問題,就有了spade演算法的提出。

spade演算法在gsp演算法的基礎上,提出了id_list的概念,來規避多次對資料集d進行全表掃瞄的問題。id_list是乙個(sid,eid)組成的集合。

我們用上面乙個例子來推導一下,了解spade演算法是如何做的。

第一輪的候選序列,,,,我們得到它們的id_list:

i1sid

eid11

i2sid

eid112

131

i3sid

eid122

2 i4sid

eid133

2 這樣我們可以很快的知道它們的支援度: :1

:3:2

:2進行剪枝,可以得到的序列模式為:

:3:2:2

然後,我們再根據序列模式自連線得到本輪的候選集,以及候選集對應的id_list(此時的id_list可以由上一輪的id_list得到),因為候選集包括: :0

:2:2

:0:0

:1:0

:0:0

(i2,i3):0

(i2,i4):0

(i3,i4):0

針對其中的的id_list進行舉例子:

i2的id_list含有3項(1,1),(2,1),(3,1);

而i3的id_list有2項(1,2),(2,2);

那麼我們可以知道,序列號相同,且i3在i2之後出現的有兩項:

(1,1)(1,2)

(2.1)(2,2)

即可以得到的id_list:

sideideid11

2212

同理得到的id_list:

sideideid11

3312

所以,可以得到的支援度為2。同樣的第二輪會進行剪枝,得到序列模式: :2

:2由於去掉第一項得到,與去掉最後一項得到,序列並不相同。所以它們是不能進行連線的,此時演算法終止。最終得到的序列模式即為: ,

(補充:如果能夠連起來,則按照二的方法,假設, 相連,則計算sid相同,且中l3與中l3的sid和eid同時相同的次數作為support)

(再補充:如果進入下一輪,即存在和序列,則連線的時候,第乙個去掉頭元素,第二個去掉尾元素,計算和<l3,l4,l5>中,l3和l4的sid和eid分別同時相同的次數作為support)

其實可以看到,spade與gsp演算法大體相同,只不過由於它多了乙個id_list記錄,使得每一次的id_list根據上一次的id_list得到(從而得到支援度),而id_list的規模是隨著剪枝的不斷進行,而規模逐漸縮小的。所以也就解決了gsp演算法多次掃瞄資料集d問題。

但是,最後提醒大家使用者一句話!這個演算法的實現雖然並不複雜,但是考慮到要處理的資料量的時候就需要非常小心謹慎,因為演算法過程會產生大量的中間候選結果,不管是計算量上還是從空間儲存效率上都會存在很大的挑戰,並且從序列模式的應用上來說,如果不是需要嚴格按照順序得到頻繁規則,個人建議使用關聯規則挖掘,其中fpg演算法是乙個不錯的選擇!

(參考:

頻繁模式挖掘 Apriori演算法

dm實驗,寫的比較二,好多情況還沒有考慮,後續有時間會修改。開始的時候資料結構沒設計好導致寫到後面費了很大的勁 不過還好python的列表有起死回生的功效 資料集 database.txt i1,i2,i5 i2,i4 i2,i3 i1,i2,i4 i1,i3 i2,i3 i1,i3 i1,i2,i...

關聯規則 頻繁模式挖掘

基本概念 二院表示 每一行對應乙個事務,每一列對應乙個項,項用二元變數表示 項集 包括0個或多個項的集合,包含k個稱為k 項集 事物的寬度 事務中項的個數 頻繁項集 滿足最小支援度閾值的所有項集 強規則 頻繁項集中提取出的高置信度的規則 關聯規則三個指標 support 支援度 表示a和b的事務所佔...

頻繁模式挖掘Apriori初學詳解

coding utf 8 import itertools class apriori def init self,min sup 0.2,datadic self.data datadic self.size len datadic get the number of events self.mi...