序列模式挖掘,即是在序列数据库中挖掘出频繁子序列,是一个具有广泛应用的重要的数据挖掘问题。PrefixSpan 算法可以有效地挖掘出大规模数据的频繁子序列,然而,它并没有项集之间的时间间隔。因此,本文提出了一种带时间间隔的序列模式挖掘算法,我们称其为I-PrefixSpan算法。
一、引言
带时间间隔的序列模式可以提供比传统序列模式更有价值的信息。我们以零售业务为例:在带时间间隔的序列模式的帮助下,零售商不仅可以了解客户的习惯,兴趣和需求,还可以了解他们购物的时间。因此,带时间间隔的序列模式允许零售商在合适的时间向正确的客户提供正确的产品和正确的服务。带时间间隔的序列模式也可以从许多其他类型的数据中挖掘出来,例如警察部门的犯罪记录,旅行社的旅行者记录,医院的诊断记录以及任何其他商业记录。在所有这些情况下,如果可以挖掘出带时间间隔的序列模式,那么在决策时将会非常有用。
比如,在电子商务的世界中,可以从日志中提取客户的购买行为。例如,在网上购买了产品A,客户在一周内返回购买产品B。这些时间间隔序列模式产生巨大的好处。最简单的应用,通过推送技术可以主动向客户发送所需的信息。无需浏览网站,客户可以获得全新的所需信息。因此,不仅客户体验到快速获得的正确信息的便利性,而且还增加了他们从该公司购买产品的可能性。
二、I-PrefixSpan算法原理
先看一下什么是时间间隔交易数据库和它的支持度的定义,举例如下:
![](https://i-blog.csdnimg.cn/blog_migrate/857dd9c3071c8a45fcfcdf6935403c95.png)
设定时间间隔集合 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 < t ≤ 3 , I 2 : 3 < t ≤ 6 , I 3 : 6 < t ≤ ∞ I_0:t=0, I_1:0<t\le3, I_2:3<t\le6,I_3:6<t\le\infty I0:t=0,I1:0<t≤3,I2:3<t≤6,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
,
&
1
,
b
2
,
&
2
,
.
.
.
,
b
m
−
1
,
&
m
−
1
,
b
m
)
(
m
≤
n
)
\beta=(b_1,\&_1,b_2,\&_2,...,b_{m-1},\&_{m-1},b_m)(m\le n)
β=(b1,&1,b2,&2,...,bm−1,&m−1,bm)(m≤n)。
β
\beta
β被称为
α
\alpha
α的 时间间隔前缀(time-interval prefix)当且仅当(1):
b
i
=
a
i
,
1
≤
i
≤
m
b_i=a_i,1\le i\le m
bi=ai,1≤i≤m;(2):
t
i
−
t
i
−
1
t_i-t_{i-1}
ti−ti−1满足
&
i
−
1
\&_{i-1}
&i−1,
1
≤
i
≤
m
−
1
1\le i\le m-1
1≤i≤m−1。
概念有点晦涩,举例如下:设定时间间隔集合 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 < t ≤ 3 , I 2 : 3 < t ≤ 6 , I 3 : 6 < t ≤ ∞ I_0:t=0, I_1:0<t\le3, I_2:3<t\le6,I_3:6<t\le\infty I0:t=0,I1:0<t≤3,I2:3<t≤6,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
,
&
1
,
b
2
,
&
2
,
.
.
.
,
b
s
−
1
,
&
s
−
1
,
b
s
)
(
s
≤
n
)
\beta=(b_1,\&_1,b_2,\&_2,...,b_{s-1},\&_{s-1},b_s)(s\le n)
β=(b1,&1,b2,&2,...,bs−1,&s−1,bs)(s≤n),使得
β
\beta
β是
α
\alpha
α的时间间隔子序列。令
i
1
<
i
2
<
.
.
.
<
i
s
i_1<i_2<...<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}'=(({a_1}',{t_1}'),({a_2}',{t_2}'),({a_3}',{t_3}'),...,({a_p}',{t_p}'))
α′=((a1′,t1′),(a2′,t2′),(a3′,t3′),...,(ap′,tp′)),其中
p
=
s
+
n
−
i
s
p=s+n-i_s
p=s+n−is被称为
α
\alpha
α相对于
β
\beta
β的投影(projection)当且仅当(1):
β
\beta
β是
α
′
{\alpha}'
α′的时间间隔前缀;(2)
α
′
{\alpha}'
α′的最后
n
−
i
s
n-i_s
n−is个元素与
α
{\alpha}
α的最后
n
−
i
s
n-i_s
n−is个元素完全相同。
举例如下:如果 α = ( ( 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}'=((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}' α′的最后 6 6 6个元素与 α {\alpha} α的最后 6 6 6个元素完全相同。进一步地,对于位置3来说, α ′ = ( ( a , 4 ) , ( b , 4 ) , ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) {\alpha}'=((a,4),(b,4),(a,6),(e,6),(c,10)) α′=((a,4),(b,4),(a,6),(e,6),(c,10)), α ′ {\alpha}' α′的最后 4 4 4个元素与 α {\alpha} α的最后 4 4 4个元素完全相同。对于位置5来说, α ′ = ( ( a , 6 ) , ( e , 6 ) , ( c , 10 ) ) {\alpha}'=((a,6),(e,6),(c,10)) α′=((a,6),(e,6),(c,10)), α ′ {\alpha}' α′的最后 2 2 2个元素与 α {\alpha} α的最后 2 2 2个元素完全相同。
上述示例表明,序列 α {\alpha} α相对于前缀 β \beta β进行投影的话,可能产生不止一个投影 α ′ {\alpha}' α′。为了区分这些不同的投影,使用 [ S i d : P o s ] [Sid:Pos] [Sid:Pos]附加到每个 α ′ {\alpha}' α′,其中 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}'=(({a_1}',{t_1}'),({a_2}',{t_2}'),({a_3}',{t_3}'),...,({a_p}',{t_p}'))
α′=((a1′,t1′),(a2′,t2′),(a3′,t3′),...,(ap′,tp′))是
α
\alpha
α相对于时间间隔前缀
β
=
(
b
1
,
&
1
,
b
2
,
&
2
,
.
.
.
,
b
s
−
1
,
&
s
−
1
,
b
s
)
\beta=(b_1,\&_1,b_2,\&_2,...,b_{s-1},\&_{s-1},b_s)
β=(b1,&1,b2,&2,...,bs−1,&s−1,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}}',{t_{s+1}}'),({a_{s+2}}',{t_{s+2}}'),({a_{s+3}}',{t_{s+3}}'),...,({a_p}',{t_p}'))
γ=((as+1′,ts+1′),(as+2′,ts+2′),(as+3′,ts+3′),...,(ap′,tp′))是
α
\alpha
α相对于前缀
β
\beta
β的后缀(postfix)。
举例如下:从后缀的定义得知,我们直接从投影中移除前缀就可以得到后缀。 β = ( a ) \beta=(a) β=(a)的3个不同的投影 α ′ {\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,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}' α′,然后可以构建 α ′ {\alpha}' α′-映射数据库 S ∣ α ′ S|_{{\alpha}'} S∣α′,最终递归生成所有的频繁子序列。下图展示了I-PrefixSpan算法的流程:
![](https://i-blog.csdnimg.cn/blog_migrate/7937ea45a7aeb20cc6132fc1d8547936.png)
以上的讲述可能确实比较晦涩,抽象化的东西都是这样。接下来,我们实例化以上的内容。
三、I-PrefixSpan算法举例
![](https://i-blog.csdnimg.cn/blog_migrate/857dd9c3071c8a45fcfcdf6935403c95.png)
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
<
t
≤
3
,
I
2
:
3
<
t
≤
6
,
I
3
:
6
<
t
≤
∞
I_0:t=0, I_1:0<t\le3, I_2:3<t\le6,I_3:6<t\le\infty
I0:t=0,I1:0<t≤3,I2:3<t≤6,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}'
α′,对于每个
α
′
{\alpha}'
α′该程序都会重新调用。我们现在只考虑一种情况
α
′
=
(
a
)
{\alpha}'=(a)
α′=(a),因此
I
−
P
r
e
f
i
x
S
p
a
n
(
(
a
)
,
1
,
S
∣
(
a
)
)
I-PrefixSpan((a),1,S|_{(a)})
I−PrefixSpan((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]\\ &((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)) \\ \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}'
α′就是上面那句话中的
α
\alpha
α),
α
′
{\alpha}'
α′的最后一项是
(
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个记录。
Table | a | b | c | d | e |
---|---|---|---|---|---|
I 0 I_0 I0 | 0 | 3 | 0 | 0 | 2 |
I 1 I_1 I1 | 1 | 1 | 1 | 1 | 3 |
I 2 I_2 I2 | 1 | 0 | 1 | 1 | 1 |
I 3 I_3 I3 | 0 | 1 | 3 | 1 | 0 |
上表说明了频繁的元素是 ( 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}' α′,分别是 ( 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}' α′,程序再一次被调用。
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)})
I−PrefixSpan((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]\\ &((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)) \\ \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如下:
Table | a | b | c | d | e |
---|---|---|---|---|---|
I 0 I_0 I0 | 0 | 0 | 0 | 0 | 1 |
I 1 I_1 I1 | 1 | 0 | 0 | 1 | 3 |
I 2 I_2 I2 | 0 | 0 | 1 | 1 | 0 |
I 3 I_3 I3 | 0 | 1 | 2 | 1 | 0 |
这里有一个小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}' α′,分别是 ( 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}' α′,程序再一次被调用。我们以 ( 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)})
I−PrefixSpan((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]\\ &((a,6),(c,10)) \\ [20:9]\\ &((c,14),(d,14)) \\ [30:11] \\ &((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
Table | c | e |
---|---|---|
I 0 I_0 I0 | 0 | 0 |
I 1 I_1 I1 | 0 | 0 |
I 2 I_2 I2 | 3 | 0 |
I 3 I_3 I3 | 1 | 0 |
我们可以看到,频繁元素是 ( 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}' α′,是 ( 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}' α′,程序再一次被调用。这里省略了下一步。
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)})
I−PrefixSpan((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]\\ &((c,10)) \\ [20:7]\\ &((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
Table | b | c | e |
---|---|---|---|
I 0 I_0 I0 | 1 | 0 | 0 |
I 1 I_1 I1 | 0 | 0 | 1 |
I 2 I_2 I2 | 0 | 1 | 0 |
I 3 I_3 I3 | 0 | 1 | 0 |
我们可以看到,表中没有频繁元素了,这个分支的递归结束。
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)})
I−PrefixSpan((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]\\ &((c,10)) \\ [20:9]\\ &((c,14),(d,14)) \\ [30:11] \\ &((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
Table | b | c | e |
---|---|---|---|
I 0 I_0 I0 | 0 | 0 | 0 |
I 1 I_1 I1 | 0 | 0 | 0 |
I 2 I_2 I2 | 1 | 3 | 0 |
I 3 I_3 I3 | 0 | 1 | 0 |
我们可以看到,频繁元素是 ( I 2 , c ) (I_2,c) (I2,c)。将这些元素加入到 ( a , I 1 , e ) (a,I_1,e) (a,I1,e)的末尾,生成了1个 α ′ {\alpha}' α′,是 ( a , I 1 , e , I 2 , c ) (a,I_1,e,I_2,c) (a,I1,e,I2,c)。对于所有的新的不同的 α ′ {\alpha}' α′,程序再一次被调用。这里,我们再扩展一步。
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)})
I−PrefixSpan((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]\\ & \\ [20:14]\\ &((d,14)) \\ [30:16] \\ &((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
Table | c |
---|---|
I 0 I_0 I0 | 0 |
I 1 I_1 I1 | 0 |
I 2 I_2 I2 | 1 |
I 3 I_3 I3 | 0 |
我们可以看到,表中没有频繁元素了,这个分支的递归结束。
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)})
I−PrefixSpan((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]\\ & \\ [20:14]\\ &((d,14)) \\ [30:16] \\ &((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
Table | b | c | e |
---|---|---|---|
I 0 I_0 I0 | 0 | 0 | 0 |
I 1 I_1 I1 | 0 | 0 | 0 |
I 2 I_2 I2 | 0 | 1 | 0 |
I 3 I_3 I3 | 0 | 0 | 0 |
我们可以看到,表中没有频繁元素了,这个分支的递归结束。
以
α
′
=
(
a
)
{\alpha}'=(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}'=(b) α′=(b), α ′ = ( c ) {\alpha}'=(c) α′=(c), α ′ = ( d ) {\alpha}'=(d) α′=(d), α ′ = ( e ) {\alpha}'=(e) α′=(e)开头的带时间间隔的频繁子序列挖掘以上述的过程同理,这里省略。
我们可以总结一下递归停止的条件:分支下不再存在频繁元素,即构造出的 T a b l e Table Table不再存在频繁元素,则递归结束。至于其它的停止条件我得再想想,感觉这个程序得实现还是有点难度的。
另外,我感觉时间复杂度与时间间隔集合 T I TI TI的设定关系很大。
参考文献
【1】Discovering time-interval sequential patterns in sequence databases