數據挖掘:周期性分析SMCA算法
原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978
算法介紹
以時間順序挖掘周期性的模式(即周期性分析)是一種重要的數據挖掘方式,在以前的研究中我們假設每個時間點只發生一個事件,然而在這篇文章中我們研究一種更普遍的模式:即在每個時間點可以發生多個事件。
在這個算法中我們需要自己設置三個參數:min_rep, max_dis, global_rep。分別代表“一個有效序列的最小重復次數”、“相鄰有效序列最大允許擾動”、“有效序列總的要求重復次數”。其實在算法最后中我們會發現,我們也可以設置另外一個參數Lmaxn,即允許的最大周期。
最后,這個算法原作者似乎認為效果不錯,->.->
問題定義
在這個部分中,我們定義一些異步周期挖掘的問題。
E代表所有事件的集合,即一個事件的集合一定是E的一個非空子集。信息庫D是一系列的時間記錄,每一個記錄用一個數組來表示(tid, X),表示在tid時刻發生了集合X中的事件。同時D的這種表示方法我們定義為水平表達格式(horizontal format),具體請看下表。同時對於另一個事件集合Y,我們定義Y是被一個時間記錄所支持需滿足:Y⊆X。一個有k個事件的序列一般稱為k-事件序列(k-event set)。
| Time | Event Set | Time | Event Set | Time | Event Set |
|---|---|---|---|---|---|
| 1 | A, B, C | 7 | A, B, C, D | 13 | A, C, D |
| 2 | B, D | 8 | A | 14 | A, C |
| 3 | A, C, D | 9 | A, C, D | 15 | A, D |
| 4 | B | 10 | A, C | 16 | A, C, D |
| 5 | A, C | 11 | D | 17 | A |
| 6 | D | 12 | A, B, C, D | 18 | A, B, C, D |
定義 1:一個以l為周期的模式是一個非空序列P=(p1,p2,...,pl),其中p1是一個事件序列,其他的或者是一個事件序列,或者是*,即可以理解為任何序列。
一個模式P若包含i個事件則被稱作i-模式(i-pattern)。特別的,我們稱1-模式為單模式(singular patterns),當i>1時我們稱之為復雜模式(complax patterns),例如(A, *, *)是一個單模式而(A, B, *)是一個2-模式,也稱為復雜模式。如果一個模式不包含任何“*”我們就稱之為滿模式(full pattern),否則就稱之為部分模式(partial pattern)。
定義 2:設有周期為了的模式P=(p1,p2,...,pl)和一個包含l個事件的集合D'=(d1,d2,...,dl),我們定義P匹配D'當且僅當對於每個j(1<=j<=l),或者pj=*,或者pj⊆dj。D'也可以稱為P的一個匹配項。
比如現在有一個模式P=(A, B, *),那么*顯然可以和任何事件序列匹配,於是如果我們有D=(A, B, C)就是一個P的一個匹配項。
定義 3:為了方便,我們用一個4元組(P, l, rep, pos)來定義一個模式片段P,它的周期l,開始位置是pos,並重復rep次,一般我們假設這個rep要取最大值(maximum segment)。
定義 4:一個最大片段(maximum segment)是一個有效片段當且僅當其重復次數不小於參數min_rep。
我們再定義一下擾動的概念:連個片段的擾動就是第一個片段的尾部和第二個片段的開始的位置之間的距離。例如在下圖中,S1和S3之間的擾動是8(15 - 3)。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | C | B | A | E | D | A | A | B | C | A | B | C | A | A | D | A | A | B | C | A | E | C |
| D1 | D1 | D1 | D2 | D2 | D2 | D3 | D3 | D3 | D8 | D8 | D8 | D9 | D9 | D9 | D10 | D10 | D10 | |||||
| S1 | S1 | S1 | S1 | S1 | S1 | S1 | S1 | S1 | S3 | S3 | S3 | S3 | S3 | S3 | S3 | S3 | S3 |
定義 5:假設一個時間的數據庫D和一個模式P,序列D是一系列不重合的有效序列,並且其中任意相鄰片段的擾動小於一個預定的值,我們稱之為最大擾動max_dis。一個序列被稱作是有效的當且僅當P的全部的重合的次數大於一個預定的參數global_rep。
對於Fig.1b,如果我們設min_rep = 2, global_rep = 6, max_dis = 8,那么我們將會得到兩個有效序列(S1, S2),和(S1, S3)。而我們的任務找到所有有效的周期序列,其周期在1~Lmax之間,其中Lmax由用戶給定。
算法預覽
在這個模塊中,我們從挖掘單模式的周期序列到復雜模式周期序列,展示一下在時間數據庫中異步周期序列挖掘的過程。首先一個稱為“SPMiner”被用來找所有的單模式周期序列,它的原理主要是潛在循環試探(Potential Cycle Detection)和基於哈希的表(Hash-Based Validation)。然后,兩個算法“MPMiner”和“CPMiner”被用來尋找有效的多重單模式(multievent 1-patterns)和復雜模式序列(complex patterns)。最后,所有的有效片段都可以組合在一起來檢測是否滿足要求,即最后的"APMiner"。詳細見下圖:

現在我們分步驟來講解每一步的具體方法及部分偽代碼
SPMiner:Segment Mining for Single Event Pattern
- 首先,我們在前面提過一種叫做水平數據格式(horizontal database layout)的數據結構,現在我們要使用一種和其相對應的垂直數據格式(vertical database format),具體請見下表,它可以大大提高我們的搜索效率。
| Event | TimeList |
|---|---|
| A | 1, 3, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18 |
| B | 1, 2, 4, 7, 12, 18 |
| C | 1, 3, 5, 7, 9, 10, 12, 13, 14, 16, 18 |
| D | 2, 3, 6, 7, 9, 11, 12, 13, 15, 16, 18 |
-
PCD算法(Potential Cycle Detection)測探所有在1~Lmax之間的可能周期,具體看偽代碼。
-
HBV算法(Hash-Based Validation)可以對於每個潛在的周期p和一個事件列表e,通過遍歷一遍事件表來找出所有的單模式序列。具體看偽代碼。
Procedure of SPMiner(D, Lmax)
for each event Ei ∈ VD do:
PCD(Ei, TimeList);
for p = 1 to Lmax do
if(CheckSet[p] >= min_rep)
then HBV(Ei, Ei.TimeList, p);
Procedure of PCD(TimeList)
for i = 1 to i <= Lmax do CheckSet[i] = 1;
for each time instant Ti ∈ TimeList do
for each time instant Tj ∈ TimeList, i < j do
if((Tj - Ti) <= Lmax) then
CheckSet[Tj - Ti]++;
else break;
Procedure of HBV(EvtSet, TimeList, p)
Allocate data structure Cseg[p];
for i = 0 to p - 1 do /* Initilization */
Cseg[i].last = -Max; Cseg[i].rep = 1;
/* Validation */
for each time instant Ti ∈ TimeList do
pos = Ti % p;
if(Ti - Cseg[pos].last == p) then
Cseg[pos].rep++; Cseg[pos].last = Ti; continue;
if(Cseg[pos].rep >= min_rep) then
Output(EvtSet, p, Cseg[pos].rep, Cseg[pos].last - p * (Cseg[pos].rep - 1));
Cseg[pos].rep = 1; Cseg[pos].last = Ti;
for i = 0 to p - 1 do /* Rechecking */
if(Cseg[i].rep >= min_rep) then
Output(EvtSet, p, Cseg[i].rep, Cseg[i].last - p * (Cseg[i].rep - 1));
最后我們會得到如下的結果
| Pattern | Period | Rep | Start |
|---|---|---|---|
| A | 1 | 7 | 12 |
| A | 2 | 5 | 1 |
| A | 2 | 6 | 8 |
| C | 2 | 5 | 1 |
| C | 2 | 5 | 10 |
| D | 2 | 5 | 7 |
| D | 3 | 6 | 3 |
MPMiner: Multievent Patterns
這里我們直接介紹推薦的SBE算法(Segment-Based Enumeration)。
SBE算法的思路是,對於一個周期p,先在上表中找到周期為p的項。我們假設一個變量off = start % p,這樣我們在此步找到的組合內部off則一定相同。如果最后重合部分還大於參數min_rep,那么我們就成功的找到了一組答案了。而對於重合的部分,我們也可以根據上表在O(1)的時間內計算出來。
CPMiner:Complex Patterns
這一步的做法和上一步的SBE算法十分相似。
不過在上一步中我們要求off相同才能放在一組,而在這一步中我們要求off必須不同才能在一組,偽代碼如下
Procedure of CPMiner(p, SegListp, w.r.t period p)
for each segment Si ∈ SegListp; do
Node.Head = Si;
Node.Tail = all segment Sj ∈ SegList with j > i;
Node.start = Si.start;
Node.end = Si.start + (Si.rep - 1) * p;
CP(Node, p);
Subprocedure of CP_DFS(Node, p)
if(|Node.Head| == p) then return ;
for each segment Si ∈ Node.Tail do
Valid = True;
for each setment Sj ∈ Node.Head do
if((Si.start - Sj.start) % p == 0) then
Valid = false; break;
if(Valid == false) then continue;
newC.start = Si.start;
newC.end = Min{Node.end, Si.start + (Si.rep - 1) * p}; //take care
rep = ⌈(newC.end - newC.start) / p⌉ + 1;
if(rep >= min_rep)
newC.Head = Node.Head ∪ Si;
newC.Tail = all Sk ∈ Node.Tail with k > i;
PatternOutput(newC, p, rep)
CP_DFS(newC, p);
else if(Node.end - Node.start + 1 < p * min_rep) break;
Subprocedure of PatternOutput(Node, p, rep)
Shift = Node.end % p //take care not Node.start!
for i = 1 to p do Pattern[i] = *;
for each segment Si ∈ Node.Head do
Pattern[(Si.start - Shift) % p] = Si.EvtSet;
Output(Pattern, rep, p, Node.end - (rep - 1) * p);
APMiner:Asynchronous Pattern
就像我們在定義5中說的那樣,一個異步周期模式被定義為有一組序列互不重合。因此我們還需使用深度優先搜索來枚舉所有的組合方式。現在假設我們把所有的片段按照開始的時間排序,一個單模式的片段如果重復次數大於global_rep,那么它本身就是一個合法答案,但是每次枚舉過程中,我們總要盡力的把新的事件加入到已有的事件序列中。同時,如果新的片段距離的開始位置距離已有片段的距離小於max_dis,那么我們也可以把它加入進去。但是一旦上述條件不符合的話,我們就可以跳出搜索了,因為我們是按照開始的時間順序有小到大排序的,這樣可以達到剪枝的效果。
其他
這個算法總體就是這個樣子,如果想看更詳細的請參考鏈接:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978歡迎大家留言交流。
