关联规则(三):带时间间隔的序列模式挖掘

序列模式挖掘,即是在序列数据库中挖掘出频繁子序列,是一个具有广泛应用的重要的数据挖掘问题。PrefixSpan 算法可以有效地挖掘出大规模数据的频繁子序列,然而,它并没有项集之间的时间间隔。因此,本文提出了一种带时间间隔的序列模式挖掘算法,我们称其为I-PrefixSpan算法。

一、引言

带时间间隔的序列模式可以提供比传统序列模式更有价值的信息。我们以零售业务为例:在带时间间隔的序列模式的帮助下,零售商不仅可以了解客户的习惯,兴趣和需求,还可以了解他们购物的时间。因此,带时间间隔的序列模式允许零售商在合适的时间向正确的客户提供正确的产品和正确的服务。带时间间隔的序列模式也可以从许多其他类型的数据中挖掘出来,例如警察部门的犯罪记录,旅行社的旅行者记录,医院的诊断记录以及任何其他商业记录。在所有这些情况下,如果可以挖掘出带时间间隔的序列模式,那么在决策时将会非常有用。

比如,在电子商务的世界中,可以从日志中提取客户的购买行为。例如,在网上购买了产品A,客户在一周内返回购买产品B。这些时间间隔序列模式产生巨大的好处。最简单的应用,通过推送技术可以主动向客户发送所需的信息。无需浏览网站,客户可以获得全新的所需信息。因此,不仅客户体验到快速获得的正确信息的便利性,而且还增加了他们从该公司购买产品的可能性。

二、I-PrefixSpan算法原理

先看一下什么是时间间隔交易数据库和它的支持度的定义,举例如下:

设定时间间隔集合 I T = { I 0 , I 1 , I 2 , I 3 } IT=\left \{ I_0,I_1,I_2,I_3\right \} IT={I0,I1,I2,I3},其中 I 0 : t = 0 , I 1 : 0 &lt; t ≤ 3 , I 2 : 3 &lt; t ≤ 6 , I 3 : 6 &lt; t ≤ ∞ I_0:t=0, I_1:0&lt;t\le3, I_2:3&lt;t\le6,I_3:6&lt;t\le\infty I0:t=0,I1:0<t3,I2:3<t6,I3:6<t。有一时间间隔的序列 ( b , I 1 , e , I 2 , c ) (b,I_1,e,I_2,c) (b,I1,e,I2,c)包括3项,因此该序列长度为3。我们称其为3时间间隔序列( 3-time-interval sequence)。我们可以看到, ( b , I 1 , e , I 2 , c ) (b,I_1,e,I_2,c) (b,I1,e,I2,c)是交易序号40的时间间隔子序列,同样,它也是交易序号10和30时间间隔子序列,因此,它的支持度为 0.75 0.75 0.75。如果设定最小支持度为0.5, ( b , I 1 , e , I 2 , c ) (b,I_1,e,I_2,c) (b,I1,e,I2,c)就是该交易数据库的频繁3时间间隔子序列

接下来,我先介绍带时间间隔的前缀,投影,后缀,映射数据库等概念。形式化地介绍一下I-PrefixSpan算法。


定义一
给定一个交易序列 α = ( ( a 1 , t 1 ) , ( a 2 , t 2 ) , ( a 3 , t 3 ) , . . . , ( a n , t n ) ) \alpha=((a_1,t_1),(a_2,t_2),(a_3,t_3),...,(a_n,t_n)) α=((a1,t1),(a2,t2),(a3,t3),...,(an,tn))和一个时间间隔序列 β = ( b 1 , &amp; 1 , b 2 , &amp; 2 , . . . , b m − 1 , &amp; m − 1 , b m ) ( m ≤ n ) \beta=(b_1,\&amp;_1,b_2,\&amp;_2,...,b_{m-1},\&amp;_{m-1},b_m)(m\le n) β=(b1,&1,b2,&2,...,bm1,&m1,bm)(mn) β \beta β被称为 α \alpha α时间间隔前缀(time-interval prefix)当且仅当(1): b i = a i , 1 ≤ i ≤ m b_i=a_i,1\le i\le m bi=ai,1im;(2): t i − t i − 1 t_i-t_{i-1} titi1满足 &amp; i − 1 \&amp;_{i-1} &i1 1 ≤ i ≤ m − 1 1\le i\le m-1 1im1

概念有点晦涩,举例如下:设定时间间隔集合 I T = { I 0 , I 1 , I 2 , I 3 } IT=\left \{ I_0,I_1,I_2,I_3\right \} IT={I0,I1,I2,I3},其中 I 0 : t = 0 , I 1 : 0 &lt; t ≤ 3 , I 2 : 3 &lt; t ≤ 6 , I 3 : 6 &lt; t ≤ ∞ I_0:t=0, I_1:0&lt;t\le3, I_2:3&lt;t\le6,I_3:6&lt;t\le\infty I0:t=0,I1:0<t3,I2:3<t6,I3:6<t β = ( b , I 0 , c , I 1 , a ) \beta=(b,I_0,c,I_1,a) β=(b,I0,c,I1,a) α = ( ( b , 1 ) , ( c , 1 ) , ( a , 3 ) , ( e , 5 ) , ( b , 7 ) , ( d , 7 ) , ( a , 11 ) ) \alpha=((b,1),(c,1),(a,3),(e,5),(b,7),(d,7),(a,11)) α=((b,1),(c,1),(a,3),(e,5),(b,7),(d,7),(a,11))时间间隔前缀


定义二
给定一个交易序列 α = ( ( a 1 , t 1 ) , ( a 2 , t 2 ) , ( a 3 , t 3 ) , . . . , ( a n , t n ) ) \alpha=((a_1,t_1),(a_2,t_2),(a_3,t_3),...,(a_n,t_n)) α=((a1,t1),(a2,t2),(a3,t3),...,(an,tn))和一个时间间隔序列 β = ( b 1 , &amp; 1 , b 2 , &amp; 2 , . . . , b s − 1 , &amp; s − 1 , b s ) ( s ≤ n ) \beta=(b_1,\&amp;_1,b_2,\&amp;_2,...,b_{s-1},\&amp;_{s-1},b_s)(s\le n) β=(b1,&1,b2,&2,...,bs1,&s1,bs)(sn),使得 β \beta β α \alpha α的时间间隔子序列。令 i 1 &lt; i 2 &lt; . . . &lt; i s i_1&lt;i_2&lt;...&lt;i_s i1<i2<...<is是与 β \beta β中元素匹配的 α \alpha α元素的索引。一个 α \alpha α的子序列 α ′ = ( ( a 1 ′ , t 1 ′ ) , ( a 2 ′ , t 2 ′ ) , ( a 3 ′ , t 3 ′ ) , . . . , ( a p ′ , t p ′ ) ) {\alpha}&#x27;=(({a_1}&#x27;,{t_1}&#x27;),({a_2}&#x27;,{t_2}&#x27;),({a_3}&#x27;,{t_3}&#x27;),...,({a_p}&#x27;,{t_p}&#x27;)) α=((a1,t1),(a2,t2),(a3,t3),...,(ap,tp)),其中 p = s + n − i s p=s+n-i_s p=s+nis被称为 α \alpha α相对于 β \beta β投影(projection)当且仅当(1): β \beta β α ′ {\alpha}&#x27; α时间间隔前缀;(2) α ′ {\alpha}&#x27; α的最后 n − i s n-i_s nis个元素与 α {\alpha} α的最后 n − i s n-i_s nis个元素完全相同。

举例如下:如果 α = ( ( a , 1 ) , ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) \alpha=((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) α=((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10))被投影到 β = ( a ) \beta=(a) β=(a),则可以获得3个不同的映射,分别是 ( ( a , 1 ) , ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ( ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,4),(b,4),(a,6),(e,6),(c,10)) ((a,4),(b,4),(a,6),(e,6),(c,10)) ( ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,6),(e,6),(c,10)) ((a,6),(e,6),(c,10)),值得注意的是,前缀 β \beta β α \alpha α中出现了3次,第一次出现在了位置1,第二次出现在了位置3,第三次出现在了位置5。对于位置1来说, α ′ = ( ( a , 1 ) , ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) {\alpha}&#x27;=((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) α=((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) α ′ {\alpha}&#x27; α的最后 6 6 6个元素与 α {\alpha} α的最后 6 6 6个元素完全相同。进一步地,对于位置3来说, α ′ = ( ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) {\alpha}&#x27;=((a,4),(b,4),(a,6),(e,6),(c,10)) α=((a,4),(b,4),(a,6),(e,6),(c,10)) α ′ {\alpha}&#x27; α的最后 4 4 4个元素与 α {\alpha} α的最后 4 4 4个元素完全相同。对于位置5来说, α ′ = ( ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) {\alpha}&#x27;=((a,6),(e,6),(c,10)) α=((a,6),(e,6),(c,10)) α ′ {\alpha}&#x27; α的最后 2 2 2个元素与 α {\alpha} α的最后 2 2 2个元素完全相同。

上述示例表明,序列 α {\alpha} α相对于前缀 β \beta β进行投影的话,可能产生不止一个投影 α ′ {\alpha}&#x27; α。为了区分这些不同的投影,使用 [ S i d : P o s ] [Sid:Pos] [SidPos]附加到每个 α ′ {\alpha}&#x27; α,其中 S i d Sid Sid是交易序列的标识符, P o s Pos Pos是匹配 β \beta β的最后一个元素在 α {\alpha} α的位置。


定义三
α ′ = ( ( a 1 ′ , t 1 ′ ) , ( a 2 ′ , t 2 ′ ) , ( a 3 ′ , t 3 ′ ) , . . . , ( a p ′ , t p ′ ) ) {\alpha}&#x27;=(({a_1}&#x27;,{t_1}&#x27;),({a_2}&#x27;,{t_2}&#x27;),({a_3}&#x27;,{t_3}&#x27;),...,({a_p}&#x27;,{t_p}&#x27;)) α=((a1,t1),(a2,t2),(a3,t3),...,(ap,tp)) α \alpha α相对于时间间隔前缀 β = ( b 1 , &amp; 1 , b 2 , &amp; 2 , . . . , b s − 1 , &amp; s − 1 , b s ) \beta=(b_1,\&amp;_1,b_2,\&amp;_2,...,b_{s-1},\&amp;_{s-1},b_s) β=(b1,&1,b2,&2,...,bs1,&s1,bs)投影。我们称 γ = ( ( a s + 1 ′ , t s + 1 ′ ) , ( a s + 2 ′ , t s + 2 ′ ) , ( a s + 3 ′ , t s + 3 ′ ) , . . . , ( a p ′ , t p ′ ) ) \gamma=(({a_{s+1}}&#x27;,{t_{s+1}}&#x27;),({a_{s+2}}&#x27;,{t_{s+2}}&#x27;),({a_{s+3}}&#x27;,{t_{s+3}}&#x27;),...,({a_p}&#x27;,{t_p}&#x27;)) γ=((as+1,ts+1),(as+2,ts+2),(as+3,ts+3),...,(ap,tp)) α \alpha α相对于前缀 β \beta β后缀(postfix)。

举例如下:从后缀的定义得知,我们直接从投影中移除前缀就可以得到后缀。 β = ( a ) \beta=(a) β=(a)的3个不同的投影 α ′ {\alpha}&#x27; α分别是 ( ( a , 1 ) , ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ((a,1),(c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ( ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,4),(b,4),(a,6),(e,6),(c,10)) ((a,4),(b,4),(a,6),(e,6),(c,10)) ( ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((a,6),(e,6),(c,10)) ((a,6),(e,6),(c,10))。因此,3个后缀分别是 ( ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ((c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ( ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((b,4),(a,6),(e,6),(c,10)) ((b,4),(a,6),(e,6),(c,10)) ( ( e , 6 ) , ( c , 10 ) ) ((e,6),(c,10)) ((e,6),(c,10))

最后, α \alpha α-映射数据库,我们用 S ∣ α S|_\alpha Sα表示,定义为交易数据库 S S S相对于 α \alpha α的后缀的集合。


I-PrefixSpan算法最重要的一点在于,其包括了在 S ∣ α S|_\alpha Sα中的频繁项 b b b α \alpha α中的最后一项之间的时间间隔关系。在I-PrefixSpan,使用了一个数据结构表 T a b l e Table Table来具体解决这个问题。具体地,在交易数据库中, T a b l e Table Table的每一列代表每个频繁1项集(可以理解为每个sku),每一行代表时间间隔集合 I T = { I 0 , I 1 , I 2 , . . . , I r } IT=\left \{ I_0,I_1,I_2,...,I_r\right \} IT={I0,I1,I2,...,Ir}的每一项。 T a b l e Table Table的元素 T a b l e ( I i , b ) Table(I_i,b) Table(Ii,b)记录了 S ∣ α S|_\alpha Sα中满足商品 b b b α \alpha α的最后一项之间的时间差位于 I i I_i Ii内的那些交易的数量和

顺序地处理 S ∣ α S|_\alpha Sα中的每个交易从而构建 T a b l e Table Table和那些频繁出现的元素。如果元素 T a b l e ( I i , b ) Table(I_i,b) Table(Ii,b)是一个频繁元素, ( I i , b ) (I_i,b) (Ii,b)可以加入到 α \alpha α中从而生成一个时间间隔序列模式 α ′ {\alpha}&#x27; α,然后可以构建 α ′ {\alpha}&#x27; α-映射数据库 S ∣ α ′ S|_{{\alpha}&#x27;} Sα,最终递归生成所有的频繁子序列。下图展示了I-PrefixSpan算法的流程:

以上的讲述可能确实比较晦涩,抽象化的东西都是这样。接下来,我们实例化以上的内容。

三、I-PrefixSpan算法举例

A
设定时间间隔集合 I T = { I 0 , I 1 , I 2 , I 3 } IT=\left \{ I_0,I_1,I_2,I_3\right \} IT={I0,I1,I2,I3},其中 I 0 : t = 0 , I 1 : 0 &lt; t ≤ 3 , I 2 : 3 &lt; t ≤ 6 , I 3 : 6 &lt; t ≤ ∞ I_0:t=0, I_1:0&lt;t\le3, I_2:3&lt;t\le6,I_3:6&lt;t\le\infty I0:t=0,I1:0<t3,I2:3<t6,I3:6<t。交易序列数据库还使用图1所示。最小支持度设定为2。在一开始, α = n u l l \alpha=null α=null,1频繁项集为 ( a ) , ( b ) , ( c ) , ( d ) , ( e ) (a),(b),(c),(d),(e) (a),(b),(c),(d),(e)。因为 f f f只出现了1次。把这5个频繁项集加入到 α = n u l l \alpha=null α=null后会生成5个不同的 α ′ {\alpha}&#x27; α,对于每个 α ′ {\alpha}&#x27; α该程序都会重新调用。我们现在只考虑一种情况 α ′ = ( a ) {\alpha}&#x27;=(a) α=(a),因此 I − P r e f i x S p a n ( ( a ) , 1 , S ∣ ( a ) ) I-PrefixSpan((a),1,S|_{(a)}) IPrefixSpan((a),1,S(a))被调用,则投影数据库 S ∣ ( a ) S|_{(a)} S(a)如下所示:
[ 10 : 1 ] ( ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) [ 10 : 4 ] ( ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) [ 10 : 6 ] ( ( e , 6 ) , ( c , 10 ) ) [ 20 : 7 ] ( ( b , 7 ) , ( e , 7 ) , ( d , 9 ) , ( e , 9 ) , ( c , 14 ) , ( d , 14 ) ) [ 30 : 8 ] ( ( b , 8 ) , ( e , 11 ) , ( d , 13 ) , ( b , 16 ) , ( c , 16 ) , ( c , 20 ) ) \begin{aligned} [10:1]\\ &amp;((c,3),(a,4),(b,4),(a,6),(e,6),(c,10))\\ [10:4]\\ &amp;((b,4),(a,6),(e,6),(c,10)) \\ [10:6] \\ &amp;((e,6),(c,10)) \\ [20:7]\\ &amp;((b,7),(e,7),(d,9),(e,9),(c,14),(d,14)) \\ [30:8] \\ &amp;((b,8),(e,11),(d,13),(b,16),(c,16),(c,20)) \\ \end{aligned} [10:1][10:4][10:6][20:7][30:8]((c,3),(a,4),(b,4),(a,6),(e,6),(c,10))((b,4),(a,6),(e,6),(c,10))((e,6),(c,10))((b,7),(e,7),(d,9),(e,9),(c,14),(d,14))((b,8),(e,11),(d,13),(b,16),(c,16),(c,20))

在程序中,如下图所示的 T a b l e Table Table会首先构造出来。上面我们提过:这个表构造的过程就是记录了 S ∣ α S|_\alpha Sα中满足商品 b b b α \alpha α的最后一项之间的时间差位于 I i I_i Ii内的那些交易的数量和。(注:这里的 α ′ {\alpha}&#x27; α就是上面那句话中的 α \alpha α), α ′ {\alpha}&#x27; α的最后一项是 ( a ) (a) (a) ( a ) (a) (a)在交易数据库中出现的位置分别是 [ 10 : 1 ] , [ 10 : 4 ] , [ 10 : 6 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:1],[10:4],[10:6],[20:7],[30:8] [10:1],[10:4],[10:6],[20:7],[30:8],我们依次遍历 ( a ) (a) (a)的后缀,以 ( ( c , 3 ) , ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) ((c,3),(a,4),(b,4),(a,6),(e,6),(c,10)) ((c,3),(a,4),(b,4),(a,6),(e,6),(c,10))为例,计算下时间差,填入到对应的 I i I_i Ii中。就可以得到下表:
注意:在一条记录里最多只能出现1个。例如,在 S i d = 10 Sid=10 Sid=10 ( a , I 1 , a ) (a,I_1,a) (a,I1,a)有两次,但是也只能算1条,因为这只是1个记录

Tableabcde
I 0 I_0 I003002
I 1 I_1 I111113
I 2 I_2 I210111
I 3 I_3 I301310

上表说明了频繁的元素是 ( I 0 , b ) , ( I 0 , e ) , ( I 1 , e ) , ( I 3 , c ) (I_0,b),(I_0,e),(I_1,e),(I_3,c) (I0,b),(I0,e),(I1,e),(I3,c)。将这些元素加入到 ( a ) (a) (a)的末尾,生成了4个不同的 α ′ {\alpha}&#x27; α,分别是 ( a , I 0 , b ) , ( a , I 0 , e ) , ( a , I 1 , e ) , ( a , I 3 , c ) (a,I_0,b),(a,I_0,e),(a,I_1,e),(a,I_3,c) (a,I0,b),(a,I0,e),(a,I1,e),(a,I3,c)。对于所有的新的不同的 α ′ {\alpha}&#x27; α,程序再一次被调用。

B-1
对于 ( a , I 0 , b ) (a,I_0,b) (a,I0,b),程序将会调用 I − P r e f i x S p a n ( ( a , I 0 , b ) , 2 , S ∣ ( a , I 0 , b ) ) I-PrefixSpan((a,I_0,b),2,S|_{(a,I_0,b)}) IPrefixSpan((a,I0,b),2,S(a,I0,b)),其投影数据库 S ∣ ( a , I 0 , b ) S|_{(a,I_0,b)} S(a,I0,b)如下所示:
[ 10 : 4 ] ( ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) [ 20 : 7 ] ( ( e , 7 ) , ( d , 9 ) , ( e , 9 ) , ( c , 14 ) , ( d , 14 ) ) [ 30 : 8 ] ( ( e , 11 ) , ( d , 13 ) , ( b , 16 ) , ( c , 16 ) , ( c , 20 ) ) \begin{aligned} [10:4]\\ &amp;((a,6),(e,6),(c,10)) \\ [20:7]\\ &amp;((e,7),(d,9),(e,9),(c,14),(d,14)) \\ [30:8] \\ &amp;((e,11),(d,13),(b,16),(c,16),(c,20)) \\ \end{aligned} [10:4][20:7][30:8]((a,6),(e,6),(c,10))((e,7),(d,9),(e,9),(c,14),(d,14))((e,11),(d,13),(b,16),(c,16),(c,20))

( a , I 0 , b ) (a,I_0,b) (a,I0,b)出现了3次,其最后一项是 ( b ) (b) (b) ( b ) (b) (b)来自于投影数据库 S ∣ ( a ) S|_{(a)} S(a) [ 10 : 4 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:4],[20:7],[30:8] [10:4],[20:7],[30:8],且 ( b ) (b) (b)出现的位置分别是 [ 10 : 4 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:4],[20:7],[30:8] [10:4],[20:7],[30:8],故其投影数据库 S ∣ ( a , I 0 , b ) S|_{(a,I_0,b)} S(a,I0,b)如上所示。注意: S ∣ ( a , I 0 , b ) S|_{(a,I_0,b)} S(a,I0,b) S ∣ ( a ) S|_{(a)} S(a)中的 [ 10 : 4 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:4],[20:7],[30:8] [10:4],[20:7],[30:8]中的 4 , 7 , 8 4,7,8 4,7,8的含义是完全不同的,前者代表了 b b b的位置,后者代表了 a a a的位置

它对应的 T a b l e Table Table如下:

Tableabcde
I 0 I_0 I000001
I 1 I_1 I110013
I 2 I_2 I200110
I 3 I_3 I301210

这里有一个小trick,因此 a , d a,d a,d在第一个表从来没有频繁元素,因此在以后构造表时也无需再对 a , d a,d a,d进行计算了。上表仍然计算了 a , d a,d a,d是想说明这个问题。

我们可以看到,频繁元素是 ( I 1 , e ) , ( I 3 , c ) (I_1,e),(I_3,c) (I1,e),(I3,c)。将这些元素加入到 ( a , I 0 , b ) (a,I_0,b) (a,I0,b)的末尾,生成了2个不同的 α ′ {\alpha}&#x27; α,分别是 ( a , I 0 , b , I 1 , e ) , ( a , I 0 , b , I 3 , c ) (a,I_0,b,I_1,e),(a,I_0,b,I_3,c) (a,I0,b,I1,e),(a,I0,b,I3,c)。对于所有的新的不同的 α ′ {\alpha}&#x27; α,程序再一次被调用。我们以 ( a , I 0 , b , I 1 , e ) (a,I_0,b,I_1,e) (a,I0,b,I1,e)举例。

B-1-1
对于 ( a , I 0 , b , I 1 , e ) (a,I_0,b,I_1,e) (a,I0,b,I1,e),程序将会调用 I − P r e f i x S p a n ( ( a , I 0 , b , I 1 , e ) , 3 , S ∣ ( a , I 0 , b , I 1 , e ) ) I-PrefixSpan((a,I_0,b,I_1,e),3,S|_{(a,I_0,b,I_1,e)}) IPrefixSpan((a,I0,b,I1,e),3,S(a,I0,b,I1,e)),其投影数据库 S ∣ ( a , I 0 , b , I 1 , e ) S|_{(a,I_0,b,I_1,e)} S(a,I0,b,I1,e)如下所示:
[ 10 : 6 ] ( ( a , 6 ) , ( c , 10 ) ) [ 20 : 9 ] ( ( c , 14 ) , ( d , 14 ) ) [ 30 : 11 ] ( ( d , 13 ) , ( b , 16 ) , ( c , 16 ) , ( c , 20 ) ) \begin{aligned} [10:6]\\ &amp;((a,6),(c,10)) \\ [20:9]\\ &amp;((c,14),(d,14)) \\ [30:11] \\ &amp;((d,13),(b,16),(c,16),(c,20)) \\ \end{aligned} [10:6][20:9][30:11]((a,6),(c,10))((c,14),(d,14))((d,13),(b,16),(c,16),(c,20))

( a , I 0 , b , I 1 , e ) (a,I_0,b,I_1,e) (a,I0,b,I1,e)出现了3次,其最后一项是 ( e ) (e) (e) ( e ) (e) (e)来自于投影数据库 S ∣ ( a , I 0 , b ) S|_{(a,I_0,b)} S(a,I0,b) [ 10 : 4 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:4],[20:7],[30:8] [10:4],[20:7],[30:8],且 ( e ) (e) (e)出现的位置分别是 [ 10 : 6 ] , [ 20 : 9 ] , [ 30 : 11 ] [10:6],[20:9],[30:11] [10:6],[20:9],[30:11],故其投影数据库 S ∣ ( a , I 0 , b , I 1 , e ) S|_{(a,I_0,b,I_1,e)} S(a,I0,b,I1,e)如上所示。

它对应的 T a b l e Table Table如下:无 a , b , d a,b,d a,b,d

Tablece
I 0 I_0 I000
I 1 I_1 I100
I 2 I_2 I230
I 3 I_3 I310

我们可以看到,频繁元素是 ( I 2 , c ) (I_2,c) (I2,c)。将这些元素加入到 ( a , I 0 , b , I 1 , e ) (a,I_0,b,I_1,e) (a,I0,b,I1,e)的末尾,生成了 α ′ {\alpha}&#x27; α,是 ( a , I 0 , b , I 1 , e , I 2 , c ) (a,I_0,b,I_1,e,I_2,c) (a,I0,b,I1,e,I2,c)。对于所有 α ′ {\alpha}&#x27; α,程序再一次被调用。这里省略了下一步。

B-2
对于 ( a , I 0 , e ) ( a,I_0,e) (a,I0,e),程序将会调用 I − P r e f i x S p a n ( ( a , I 0 , e ) , 2 , S ∣ ( a , I 0 , e ) ) I-PrefixSpan(( a,I_0,e),2,S|_{( a,I_0,e)}) IPrefixSpan((a,I0,e),2,S(a,I0,e)),其投影数据库 S ∣ ( a , I 0 , e ) S|_{( a,I_0,e)} S(a,I0,e)如下所示:

[ 10 : 6 ] ( ( c , 10 ) ) [ 20 : 7 ] ( ( b , 7 ) , ( d , 9 ) , ( e , 9 ) , ( c , 14 ) , ( d , 14 ) ) \begin{aligned} [10:6]\\ &amp;((c,10)) \\ [20:7]\\ &amp;((b,7),(d,9),(e,9),(c,14),(d,14)) \\ \end{aligned} [10:6][20:7]((c,10))((b,7),(d,9),(e,9),(c,14),(d,14))

( a , I 0 , e ) (a,I_0,e) (a,I0,e)出现了2次,其最后一项是 ( e ) (e) (e) ( e ) (e) (e)来自于投影数据库 S ∣ ( a ) S|_{(a)} S(a) [ 10 : 6 ] , [ 20 : 7 ] [10:6],[20:7] [10:6],[20:7],且 ( e ) (e) (e)出现的位置分别是 [ 10 : 6 ] , [ 20 : 7 ] [10:6],[20:7] [10:6],[20:7],故其投影数据库 S ∣ ( a , I 0 , e ) S|_{(a,I_0,e)} S(a,I0,e)如上所示。

同理,它对应的 T a b l e Table Table如下:无 a , d a,d a,d

Tablebce
I 0 I_0 I0100
I 1 I_1 I1001
I 2 I_2 I2010
I 3 I_3 I3010

我们可以看到,表中没有频繁元素了,这个分支的递归结束。
B-3
对于 ( a , I 1 , e ) ( a,I_1,e) (a,I1,e),程序将会调用 I − P r e f i x S p a n ( ( a , I 1 , e ) , 2 , S ∣ ( a , I 1 , e ) ) I-PrefixSpan(( a,I_1,e),2,S|_{( a,I_1,e)}) IPrefixSpan((a,I1,e),2,S(a,I1,e)),其投影数据库 S ∣ ( a , I 1 , e ) S|_{( a,I_1,e)} S(a,I1,e)如下所示:
[ 10 : 6 ] ( ( c , 10 ) ) [ 20 : 9 ] ( ( c , 14 ) , ( d , 14 ) ) [ 30 : 11 ] ( ( d , 13 ) , ( b , 16 ) , ( c , 16 ) , ( c , 20 ) ) \begin{aligned} [10:6]\\ &amp;((c,10)) \\ [20:9]\\ &amp;((c,14),(d,14)) \\ [30:11] \\ &amp;((d,13),(b,16),(c,16),(c,20)) \\ \end{aligned} [10:6][20:9][30:11]((c,10))((c,14),(d,14))((d,13),(b,16),(c,16),(c,20))

( a , I 1 , e ) ( a,I_1,e) (a,I1,e)出现了3次,其最后一项是 ( e ) (e) (e) ( e ) (e) (e)来自于投影数据库 S ∣ ( a ) S|_{(a)} S(a) [ 10 : 4 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:4],[20:7],[30:8] [10:4],[20:7],[30:8],且 ( e ) (e) (e)出现的位置分别是 [ 10 : 6 ] , [ 20 : 9 ] , [ 30 : 11 ] [10:6],[20:9],[30:11] [10:6],[20:9],[30:11],故其投影数据库 S ∣ ( a , I 1 , e ) S|_{(a,I_1,e)} S(a,I1,e)如上所示。

同理,它对应的 T a b l e Table Table如下:无 a , d a,d a,d

Tablebce
I 0 I_0 I0000
I 1 I_1 I1000
I 2 I_2 I2130
I 3 I_3 I3010

我们可以看到,频繁元素是 ( I 2 , c ) (I_2,c) (I2,c)。将这些元素加入到 ( a , I 1 , e ) (a,I_1,e) (a,I1,e)的末尾,生成了1个 α ′ {\alpha}&#x27; α,是 ( a , I 1 , e , I 2 , c ) (a,I_1,e,I_2,c) (a,I1,e,I2,c)。对于所有的新的不同的 α ′ {\alpha}&#x27; α,程序再一次被调用。这里,我们再扩展一步。

B-3-1
对于 ( a , I 1 , e , I 2 , c ) (a,I_1,e,I_2,c) (a,I1,e,I2,c),程序将会调用 I − P r e f i x S p a n ( ( a , I 1 , e , I 2 , c ) , 3 , S ∣ ( a , I 1 , e , I 2 , c ) ) I-PrefixSpan((a,I_1,e,I_2,c),3,S|_{(a,I_1,e,I_2,c)}) IPrefixSpan((a,I1,e,I2,c),3,S(a,I1,e,I2,c)),其投影数据库 S ∣ ( a , I 1 , e , I 2 , c ) S|_{(a,I_1,e,I_2,c)} S(a,I1,e,I2,c)如下所示:
[ 10 : 10 ] [ 20 : 14 ] ( ( d , 14 ) ) [ 30 : 16 ] ( ( c , 20 ) ) \begin{aligned} [10:10]\\ &amp; \\ [20:14]\\ &amp;((d,14)) \\ [30:16] \\ &amp;((c,20)) \\ \end{aligned} [10:10][20:14][30:16]((d,14))((c,20))

( a , I 1 , e , I 2 , c ) (a,I_1,e,I_2,c) (a,I1,e,I2,c)出现了3次,其最后一项是 ( c ) (c) (c) ( c ) (c) (c)来自于投影数据库 S ∣ ( a , I 1 , e ) S|_{(a,I_1,e)} S(a,I1,e) [ 10 : 6 ] , [ 20 : 9 ] , [ 30 : 11 ] [10:6],[20:9],[30:11] [10:6],[20:9],[30:11],且 ( c ) (c) (c)出现的位置分别是 [ 10 : 10 ] , [ 20 : 14 ] , [ 30 : 16 ] [10:10],[20:14],[30:16] [10:10],[20:14],[30:16],故其投影数据库 S ∣ ( a , I 1 , e , I 2 , c ) S|_{(a,I_1,e,I_2,c)} S(a,I1,e,I2,c)如上所示。

同理,它对应的 T a b l e Table Table如下:无 a , b , d , e a,b,d,e a,b,d,e

Tablec
I 0 I_0 I00
I 1 I_1 I10
I 2 I_2 I21
I 3 I_3 I30

我们可以看到,表中没有频繁元素了,这个分支的递归结束。
B-4
对于 ( a , I 3 , c ) (a,I_3,c) (a,I3,c),程序将会调用 I − P r e f i x S p a n ( ( a , I 3 , c ) , 2 , S ∣ ( a , I 3 , c ) ) I-PrefixSpan((a,I_3,c),2,S|_{(a,I_3,c)}) IPrefixSpan((a,I3,c),2,S(a,I3,c)),其投影数据库 S ∣ ( a , I 3 , c ) S|_{(a,I_3,c)} S(a,I3,c)如下所示:
[ 10 : 10 ] [ 20 : 14 ] ( ( d , 14 ) ) [ 30 : 16 ] ( ( c , 20 ) ) \begin{aligned} [10:10]\\ &amp; \\ [20:14]\\ &amp;((d,14)) \\ [30:16] \\ &amp;((c,20)) \\ \end{aligned} [10:10][20:14][30:16]((d,14))((c,20))

( a , I 3 , c ) (a,I_3,c) (a,I3,c)出现了3次,其最后一项是 ( c ) (c) (c) ( c ) (c) (c)来自于投影数据库 S ∣ ( a ) S|_{(a)} S(a) [ 10 : 1 ] , [ 20 : 7 ] , [ 30 : 8 ] [10:1],[20:7],[30:8] [10:1],[20:7],[30:8],且 ( c ) (c) (c)出现的位置分别是 [ 10 : 10 ] , [ 20 : 14 ] , [ 30 : 16 ] [10:10],[20:14],[30:16] [10:10],[20:14],[30:16],故其投影数据库 S ∣ ( a , I 3 , c ) S|_{(a,I_3,c)} S(a,I3,c)如上所示。

同理,它对应的 T a b l e Table Table如下:无 a , d a,d a,d

Tablebce
I 0 I_0 I0000
I 1 I_1 I1000
I 2 I_2 I2010
I 3 I_3 I3000

我们可以看到,表中没有频繁元素了,这个分支的递归结束。

α ′ = ( a ) {\alpha}&#x27;=(a) α=(a)开头的所有的符合支持度的频繁子序列如下:
( a , I 0 , b ) ( a , I 0 , b , I 1 , e ) ( a , I 0 , b , I 1 , e , I 2 , c ) ( a , I 0 , b , I 3 , c ) ( a , I 0 , e ) ( a , I 1 , a ) ( a , I 1 , a , I 2 , c ) ( a , I 3 , c ) (a,I_0,b)\\ (a,I_0,b,I_1,e)\\ (a,I_0,b,I_1,e,I_2,c)\\ (a,I_0,b,I_3,c)\\ (a,I_0,e)\\ (a,I_1,a)\\ (a,I_1,a,I_2,c)\\ (a,I_3,c) (a,I0,b)(a,I0,b,I1,e)(a,I0,b,I1,e,I2,c)(a,I0,b,I3,c)(a,I0,e)(a,I1,a)(a,I1,a,I2,c)(a,I3,c)
上述即是一个可以说明算法流程的例子。

α ′ = ( b ) {\alpha}&#x27;=(b) α=(b), α ′ = ( c ) {\alpha}&#x27;=(c) α=(c), α ′ = ( d ) {\alpha}&#x27;=(d) α=(d), α ′ = ( e ) {\alpha}&#x27;=(e) α=(e)开头的带时间间隔的频繁子序列挖掘以上述的过程同理,这里省略。

我们可以总结一下递归停止的条件:分支下不再存在频繁元素,即构造出的 T a b l e Table Table不再存在频繁元素,则递归结束。至于其它的停止条件我得再想想,感觉这个程序得实现还是有点难度的。

另外,我感觉时间复杂度与时间间隔集合 T I TI TI的设定关系很大。

参考文献

【1】Discovering time-interval sequential patterns in sequence databases

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值