序列模式
序列模式
1 序列模式
在Web數據挖掘中,從用戶瀏覽網頁的順序中挖掘網站的瀏覽模式是很有用的;在文本挖掘中,根據詞在句子中的順序挖掘語言模式也是非常重要的。對於這些應用,序列模式挖掘發揮著重要的作用。序列模式挖掘即從序列數據庫中發現頻繁子序列以作為模式,它是一類重要的數據挖掘問題,有著非常廣泛的應用前景,被應用在包括顧客購買行為的分析、網絡訪問模式分析、科學實驗的分析、疾病治療的早期診斷、自然災害的預測、DNA 序列的破譯等方面。
序列模式挖掘問題的定義:
一個序列中項集的個數稱為該序列的基數。
一個序列中項目中的個數稱為該序列的長度。長度為k的序列稱為k-序列。如果某個項目在一個序列的多個元素中出現,其每次出現都累加到k上。
序列模式可以簡單的理解為關聯規則+時間維度。
序列模式挖掘問題是找出所有滿足用戶指定的最小支持度的序列。
一個序列的支持度是指序列數據庫中有該序列的數據占總數據的比重。
序列挖掘算法的步驟:1、排序階段;2、頻繁項集階段;3、轉換階段;4、序列階段利用已知的頻繁集的集合來找出所需的序列。
常見的序列挖掘算法有AprioriAll算法、AprioriSome算法、GSP算法、MS-GSP算法和PrefixSpan算法。
- AprioriAll算法和Apriori算法唯一的不同是在合並時,需要區分最後兩個元素的順序。
AprioriAll算法[1]
輸入:大項集階段轉換後的序列數據庫
輸出:所有最長序列
1) L1={large1- sequence};//大項集階段得到的結果
2) For(k=2;Lk-1≠0;k++)do begin
3) Ck=Candidate-generate(Lk-1)//Ck是從Lk-1中產生的新的候選者
4) For each customer-sequence c in the database do//對數據庫中的每一個顧客序列c
5) Increment the count of all candidates in Ck that are contained in c;//對包含於c中Ck內的所有候選者計數
6) Lk=Candidates in Ck with minimumsuport;//Lk為Ck中滿足最小支持度的候選者
7) End
8) Answer=Maximal Sequences in ∪kLk
其中候選集生成算法Ck=Candidate-generate(Lk-1)如下:
輸入:所有的大(k-1)序列的集合
輸出:候選 Ck
1) Insert into Ck//首先進行 Lk-1與Lk-1的連接運算
select p.litemset1,…,p.litemseti-1,q.litemseti-1
from LK-1 p,Lk-1 q//p和q是Lk-1 中兩個不同的序列串
where p.litemset1=q.litemset1,…,
p.litemsetk-2=q.litemsetk-2;
2) delete all sequences c ∈Ck such that some//對候選者進行修剪(修剪的理論是頻繁模式集的子集合也是頻繁的)
?
- AprioriSome算法是Apriori算法的改進,具體過程分為兩個階段:
- 前推階段:此階段用於找出指定長度的所有大序列
- 回溯階段:此階段用於查找其他長度的所有大序列
AprioriSome算法
輸入:大項集階段轉換後的序列數據庫DT
輸出:所有最長序列
// Forward Phase — 前推階段;
1) L1 = {large 1-sequences};//大項目集階段的結果;
2) C1 = L1;
3) last = 1;//最後計數的Clast
4) FOR(k =2;Ck-1and Llast;k++)DO BEGIN
5) IF (Lk-1 know)THEN Ck = New candidates generated from Lk-1;//Ck=產生於Lk-1新的候選集
6) ELSE Ck = New candidates generated from Ck-1;// Ck=產生於Ck-1新的候選集
7) IF (k =next(last)) THEN BEGIN
8) FOR each customer-sequence c in the database DO//對於在數據庫中的每一個客戶序列c
9) Sum the count of all candidates in Ck that are contained in c;
//求包含在c中的Ck的候選者的數目之和
10) Lk = Candidates in Ck with minimum support;// Lk=在Ck中滿足最小支持度的候選者
11) last = k;
12) END;
13)END;
// Backward Phase — 回溯階段;
14)FOR (k - - ;k > = 1;k - - ) DO
15)IF (Lk not found in forward phase) THEN BEGIN// Lk在前推階段沒有確定的情況
16) Delete all sequences in Ck contained in Some Li, i > k;//刪除所有在Ck中包含在Lk中的序列,i>k
17) FOR each customer-sequence c in DT DO//對於在DT中的每一個客戶序列c
18) Sum the count of all candidates in Ck that are contained in c;//對在Ck中包含在c中的所有的候選這的計數
19) Lk = Candidates in Ck with minimum support// Lk =在Ck中滿足最小支持度的候選者
20)END;
21)ELSE Delete all sequences in Lk contained in Some Li,i > k;// Lk 已知
22)Answer = ∪k Lk; //從k到m求Lk的並集
在前推階段(forward phase)中,我們只對特定長度的序列進行計數。比如,前推階段我們對長度為1、2、4和6的序列計數(計算支持度),而長度為3和5的序列則在回溯階段中計數。next函數以上次遍歷的序列長度作為輸入,返回下次遍歷中需要計數的序列長度。
其中next()算法如下:
next(k: integer)
1) IF (hitk < 0.666)THEN return k + 1;
2) ELSEIF (hit k < 0.75)THEN return k + 2;
3) ELSEIF (hit k < 0.80)THEN return k + 3;
4) ELSEIF (hit k < 0.85)THEN return k + 4;
5) ELSE THEN return k + 5;
hitk被定義為大k-序列(large k-sequence)和候選k-序列(candidate k-sequence)的比率,即|Lk|/|Ck|。這個函數的功能是確定對哪些序列進行計數,在對非最大序列計數時間的浪費和計算擴展小候選序列之間作出權衡。
(3)AprioriAll和AprioriSome算法比較:
1) AprioriAll用Lk-1去算出所有的候選Ck,而AprioriSome會直接用Ck-1去算出所有的候選 Ck.,因為Ck-1包含Lk-1,所以AprioriSome會產生比較多的候選。
2)雖然AprioriSome跳躍式計算候選,但因為它所產生的候選比較多,可能在回溯階段前就占滿內存。
3)如果內存滿了,AprioriSome就會被強迫去計算最後一組的候選,(即使原本是要跳過此項)。這樣,會影響並減少已算好的兩個候選間的跳躍距離,而使得AprioriSome會變的跟AprioriAll一樣。
4)對於較低的支持度,有較長的大序列,也因此有較多的非最大序列,所以AprioriSome比較好。
(4)GSP算法
GSP算法的基本思想和Apriori算法一樣,其主要步驟包括三個步驟:
1)掃描序列數據庫,得到長度為1的序列模式L1,作為初始的種子集;
2)根據長度為i的種子集Li通過連接操作和剪切操作生成長度為i+1的候選序列模式Ci+1;然後掃描序列數據庫,計算每個候選序列模式的支持數,產生長度為i+1的序列模式Li+1,並將Li+1作為新的種子集;
3)重復第二步,直到沒有新的序列模式或新的候選序列模式產生為止。
其中,產生候選序列模式主要分兩步:
連接階段:如果去掉序列模式S1的第一個項目與去掉序列模式S2的最後一個項目所得到的序列相同,則可以將S1於S2進行連接,即將S2的最後一個項目添加到S1中。
剪切階段:若某候選序列模式的某個子序列不是序列模式,則此候選序列模式不可能是序列模式,將它從候選序列模式中刪除。
GSP算法
輸入:大項集階段轉換後的序列數據庫DT。
輸出:最大序列
1) L1 = {large 1-sequences};// 大項集階段得到的結果
2) FOR (k = 2;Lk-1;k++) DO BEGIN
3) Ck = GSPgenerate(Lk-1);//序列模式挖據
4) FOR each customer-sequence c in the database DT DO
5) Increment the count of all candidates in Ck that are contained in c;
6) Lk = Candidates in Ck with minimum support;
7) END;
8) Answer = Maximal Sequences in ∪kLk;
(4)MS-GSP算法
MS-GSP算法是基於逐級搜索的。第1行將項目的MIS值升序排序,保存在MS中。第2行運行init-pass()函數進行第一輪搜索,和MS-Apriori算法中的功能一樣,返回種子集合L,用於生成長度為2的候選序列集合C2。
在接下來的每一輪搜索中,算法的工作機理和MS-Apriori算法相似。evel2-candidate-gen函數可以基於MS-Apriori算法中的Level2-candidate-gen函數和GSP模式中的合並操作給出。c.minMISItem表示在候選序列c中具有最低的MIS值的項目。在序列挖掘模式中,具有最小MIS值的項目可以位於序列的任意位置。算法的13-14行用來確保所有的序列規則在MS-GSP算法運行完成之後可以直接生成而不需要再掃描數據。
對於序列模式挖掘,項目的順序是很重要的,這就使得合並操作比較麻煩。其中MScandidate-gen-SPM函數相對比較復雜,其算法過程如下:
Funcation MScandidate-gen-SPM(Fk-1)
- 合並生成候選序列時。
- 如果S1的第一個項目的MIS值要比S1中其他每個項目的MIS值小,然後如果滿足:
1)將S1的第二個項目和S2的最後一個項目刪除之後得到的兩個子序列是相同的。
2)S2的最後一個項目的MIS值要比S1的第一個項目的MIS值大,則序列S1和S2合並。將S2的最後一個項目擴展到S1尾部生成候選序列:
如果S2的最後一個項目{l}是獨立的元素,那麽將{l}以一個單獨元素的形式擴展到S1末尾,生成候選序列C1。
如果(S1的長度和基數都是2)並且(S2的最後一個項目要比S1的最後一個項目大)
那麽保持{l}加入到S1最後的元素的末尾生成候選序列C2。
如果((S1的長度為2,基數為1)並且(S2最後一個項目要比S1最後一個項目大))或者(S1的長度大於2)
那麽S2最後一個元素加入到S1最後元素的末尾生成候選序列C2。
(3)否則,如果S2最後一個項目的最後一個項目MIS值要比S2中其他項目都小,那麽上述方法反過來用。
(4)否則,采用GSP中的合並方法
(5)剪枝。在一個k候選序列的所有(k-1)-子序列中,如果除了唯一的不包含具有最小MIS值的項目的子序列之外,其他子序列都是非頻繁的,則這個候選序列將被剪枝。
(5)PrefixSpan算法
GSP算法可以視為采用廣度優先搜索查找所有的序列模式,而PrefixSpan則采用深度優先搜索。PrefixSpan算法在算法的過程中不產生候選集,給定初始前綴模式,不斷的通過後綴模式中的元素轉到前綴模式中,而不斷的遞歸挖掘下去。其算法如下[2] :
PrefixSpan(α,l, b)
參數:
α指前綴序列模式;
l指α的長度;
b指α的投影數據庫;
算法:
(1)掃描,找出頻繁項集b:
????????1)b可以成為α的最後一個項集(如ab + c=> abc),或者:
????????2)b可以追加到α形成新一個序列模式(如ab +_c => a(bc));(2)對於每個頻繁項b,追加到α形成新一個序列模式α‘(如abc或a(bc));
(3)對於每個α‘,構造α‘的投影數據庫,並調用prefixspan(α‘, l+1, b);
其過程為深度優先搜索。
投影數據庫,是序列數據庫S中所有相對於α前綴的後綴序列的集合。L例如:
對於序列<a(abc)(ac)d(cf)>,
<(abc)(ac)d(cf)>是前綴<a>的後綴;
<(_bc)(ac)d(cf)>是前綴<aa>的後綴;
<(_c)(ac)d(cf)>是前綴<a(ab)>的後綴;
"_"下標符代表前綴。
2 從序列模式中產生規則
至今序列模式的挖掘還沒有定義生成,但事實上定義幾類規則並進行數據挖掘也是可行的。例如定義標簽序列規則(Label Sequential Rules)。
一個標簽序列規則是形如XY的蘊含關系,其中Y是一個序列,X是一個將Y中的一些項目替換成通配符而得到的序列。一個通配符用*表示,可以匹配任何項目。被替換掉的項目一般稱為標簽。所有標簽形成數據集中一個很小的項目集合。
例如:從表2.6中可以找到一個序列數據庫,設最小支持度為30%,最小置信度為60%,可以找到一個標簽序列規則
<{1}{*}{7,*}><{1}{3}{7,8}>
標簽規則序列在一些實際應用中還是有用的,例如需要預測一個輸入序列中的標簽項目,例如上例中的3和8。規則的置信度是包含<{1}{*}{7,*}>的序列中兩個通配符分*別為3和8的概率估計。例如,在LSR的例子中,想要預測一個比較性的句子中某一個單詞是否是一個實體,而這裏把實體建模為標簽。
?
?
?
?
?
?
參考文獻:
[1] http://wenku.baidu.com/view/19ee9abd960590c69ec376c6.html
[2] http://blog.csdn.net/textboy/article/details/52526239
?
附錄:AprioriAll算法實例
表一
交易發生的時間
客戶標識
購買項
June 10‘04
2
A,B
June 12‘04
5
H
June 15‘04
2
C
June 20‘04
2
D,F,G
June 25‘04
4
C
June 25‘04
4
C,E,G
June 25‘04
1
C
June 30‘04
1
H
June 30‘04
4
D,G
July 25‘04
4
H
?
重新排序階段
表二
客戶標識
交易時間
購買項
1
June 25‘04
C
1
June 30‘04
H
2
June 10‘04
A,B
2
June 15‘04
C
2
June 20‘04
D,F,G
3
June 25‘04
C,E,G
4
June 25‘04
C
4
June 30‘04
D,G
4
July 25‘04
H
5
June 12‘04
H
?
由客戶標識及交易發生的時間為關鍵字所排序的數據庫
表三
客戶號
客戶序列
1
< (C) (H) >
2
< (A,B) (C) (D,F,G) >
3
< (C,E,G) >
4
< (C) (D,G) (H) >
5
< (C) (D,G) (H) >
?
?
客戶序列描述數據庫
表四
頻繁項集
映射
(C)
1
(D)
2
(G)
3
(DG)
4
(H)
5
?
頻繁項集分別是(C)、(D)、(G)、(D,G)和(H)
?
轉換階段:
表五
客戶標識
原始客戶序列
轉換後客戶序列
映射後序列
1
<(C)(H)>
<{(C)}{(H)}>
<{1}{5}>
2
<(A,B)(C)(D,F,G>
<{(C)}{(D)(G),(D,G)}>
<{1}{2,3,4}>
3
<(C,E,G)>
<{(C),(G)}>
<{1,3}>
4
<(C)(D,G)(H)><(H>
<{(C)}{(D),(G),(D,G)}{(H>
<{1}{2,3,4}{5}>
5
? <{(H)}>
<{5}>
?
序列階段:
表六
客戶號
客戶序列
1
<{1 5}{2}{3}{4}>
2
<{1}{3}{4}{3 5}>
3
<{1}{2}{3}{4}>
4
<{1}{3}{5}>
5
<{4}{5}>
?
本例子我們設定的Min-support=2,其求解過程如下表。
表七 L1:
1-序列
支持度
<1>
4
<2>
2
<3>
4
<4>
4
<5>
4
?
?
L2:表八
2-序列
支持度
<1 2>
2
<1 3>
4
<1 4>
3
<1 5>
3
<2 3>
2
<2 4>
2
<3 4>
3
<3 5>
2
<4 5>
2
?
?
?
?
L3:表九
3-序列
支持度
<1 2 3>
2
<1 2 4>
2
<1 3 4>
3
<1 3 5>
2
<2 3 4>
2
?
L4:表十
4-序列
支持度
<1 2 3 4>
2
?
最大頻繁子序列:表十
序列
支持度
〈1 2 3 4〉
2
〈1 3 5〉
2
〈4 5〉
2
序列模式