序列模式
购物篮数据常常包含关于商品何时被顾客购买的时间信息,利用这种信息可以将顾客在一段时间内购买的物品拼成事物序列。这种数据代表的时间之间存在某种序列关系,通常基于时间或空间的先后次序。然而,迄今为止所讨论的关联模式概念都只强调同时出现,而忽略数据中的序列信息。但是序列信息对于识别动态系统的重要特征,或者预测特定事件的未来发生时非常有价值的。
问题描述
发现序列模式(Mining Sequential Patterns)的问题输入是一个序列数据集,每一行记录与一个特定的对象(Object)所关联的事件(Events)在特定的时间点(Timestamp)出现。例如,第一行表示对象A在时间戳10所发生的事件为{2,3,5}。将对象A有关的所有事件按照时间戳增序排序,就得到对象A的一个序列(如下图所示)。
举一个序列的例子:客户在网上商店进行的不同交易的顺序:
<{数码相机,Matepad}, {内存卡},{耳机,Matepad皮套}>
序列的定义
- 序列由一个有序的元素组成
- 每一个元素
中包含一系列的事件,
- |s| 表示序列的长度,即序列中元素的个数。
- 一个k-sequence 表示一个序列包含k个事件(Events)
子序列的定义
如果序列T是另一个序列S的子序列,那么T中的每个有序元素都是S中一个有序元素的子集。形式化表示为,序列 是序列
的子序列,如果存在整数
使得
下面举一些例子并加以说明:
S | T | T是S的子序列吗? |
---|---|---|
<{2,4}, {3,5,6}, {8}> | <{2}, {3,6}, {8}> | 是 |
<{2,4}, {3,5,6}, {8}> | <{2}, {8}> | 是 |
<{1,2}, {3,4}> | <{1}, {2}> | 否 |
<{2,4}, {2,4}, {2,5}> | <{2}, {4}> | 是 |
首先看第一条,{2} 对应找到第一个{2,4}, 接着我们找{3,6} 找到对应{3,5,6}, 然后{8},找到对应的 {8},那么T是S的子序列。对于第三条,{1} 对应找到{1,2},那么接着找{2} ,由于{1,2}已经匹配了之前的{1},那么这里只能往后找,因为需要满足有序,没有找到对应的序列,所以T不是S的子序列。
序列模式挖掘
令 D 为包含一个或多个数据序列的数据集。 数据序列是指与单个数据对象关联的元素的有序列表。 例如,图 中 所示的数据集包含五个数据序列,每个对象 A、B、C、D 和 E 各一个。
序列 s 的支持度是包含 s 的所有数据序列的分数。 如果对 s 的支持度大于或等于用户指定的阈值 minsup,则将 s 声明为序列模式(或频繁序列)。
生成子序列模式
假如一个数据序列为<{a,b},{c,d,e},{f},{g,h,i}>包含的序列一共有 , 即出现在具有n个事件的数据序列中的k-序列总数。
对于从给定的事件,生成候选子序列,需要注意以下3点内容:
1. 一个项目在一个项目集中最多只能出现一次,但一个事件可以在一个序列中出现多次。
2. 次序在序列中是重要的,但是在项集中不重要。({a,b} = {b,a})
下面给出一个示例:如果给定2个事件a,b,那么结果下。
候选1-序列为 <{a}>,<{b}>,
候选2-序列为 <{a}{a}>,<{a}{b}>,<{b}{a}>,<{b}{b}><{a,b}>,
候选3-序列为 <{a} {a} {a}>, <{a} {a} {b}>, <{a} {b} {a}>, <{a} {b} {b}>, <{b} {b} {b}>, <{b} {b} {a}>, <{b} {a} {b}>, <{b} {a} {a}> <{a, b} {a}>, <{a, b} {b}>, <{a} {a, b}>, <{b} {a, b}>
如果按上面的方法取出所有的子序列,那么所带来的开销是巨大的,我们这里使用类Apriori算法,就是任意的数据序列包含一个特定的k-序列必须同时包含所有的(k-1)-子序列。下一节将介绍该算法具体实现步骤和示例。
生成子序列模式(Generalize Sequential Pattern)
算法步骤:
第1步:
扫一遍序列数据库以产生所有 1 元素频繁序列。
第2步:
重复直到找不到新的频繁序列:
- 1. 候选生成
• 合并在第 (k-1) 遍中找到的成对频繁子序列以生成包含 k 个项目的候选序列。
- 2. 候选修剪
• 修剪包含不常见 (k-1) 子序列的候选 k 序列。
- 3. 支持计数
• 对序列数据库D 进行新的遍历以找到对这些候选序列的支持度(support)。
- 4. 候选人淘汰
• 消除实际支持度小于minsup 的候选k 序列。
1. 合并的条件
对于上述第2步中,第一小步候选生产合并的解释,首选对于1-序列的合并可以和自己交还有其他序列交,如a,b产生的2-序列为<{a}{a}>,<{a}{b}>,<{b}{a}>,<{b}{b}><{a,b}>。对于k>2-序列的合并,需要参照掐头去尾原则,比如s1 = <{a}{b}>, s2 = <{b}{a}>,分别移去s1中的第一个event,和s2中的最后一个元素,如果剩下的event还想等,那么将其合并为s = <{a}{b}{c}>.
2. 如何合并
合并后的候选结果是通过扩展序列 w1 给出的,如下所示:
• 如果 w2 的最后一个元素只有一个事件,则将该元素附加到 w1
• 否则将 w2 的最后一个元素(w1 的最后一个元素中不存在)的最后一个事件添加到 w1 的最后一个元素。
下面给出示例:
w1=<{1 2 3} {4 6}> and w2 =<{2 3} {4 6} {5}> 合并 {1 2 3} {4 6} {5}
w1=<{1} {2 3} {4}> and w2 =<{2 3} {4 5}> 合并 {1} {2 3} {4 5}
w1=<{1 2 3}> and w2 =<{2 3 4}> 合并 {1 2 3 4}
3. 如何剪枝
4. 支持度计数
时限约束
本节提出一种序列模式,其中模式的事件和元素都施加了时限约束。下面举一个例子,如果要求选修数据挖掘课程的学生必须掌握数据库系统和统计学课程即<{数据库系统, 统计学}{数据挖掘}>,那么学生A:<{数据库系统}{统计学}{数据挖掘}>, 学生B:<{统计学}{数据库系统}{数据挖掘}>。虽然两个学生都没有同时学习数据库系统和统计学,但是他们都满足这一模式。相比之下,不能认为一个10年前学习了统计学课程的学生支持该模式。所以我们需要定义新的序列模式,加上时限约束。
下图中,每一个元素element都与一个时间窗口[l, u]相关联, l表示element中最早事件event发生的时间,u是时间窗口内事件发生的最晚时间。
1. 最大跨度约束(maxspan)
整个序列中最近和最早发生的事件之间的最大允许时间差。maxspan越大,那么会增大两个不相关事件成为时间相关事件的可能性。
2. 最小间隔和最大间隔约束
同时可以指定时序约束来限制序列的两个连续元素之间的时间差。 如果最大时间差 (maxgap) 为一周,则一个元素中的事件必须在前一个元素中发生的事件的一周时间内发生。 如果最小时间差 (mingap) 为零,则一个元素中的事件必须在前一个元素中发生的事件之后发生。
一个取巧的方法就是数,元素与元素之间间隔的个数。
3. 窗口大小约束
元素 中的事件不需要同时出现,可以定义一个窗口大小阈值(ws)来制定序列模式的任意元素中事件最晚和最早出现之间的最大允许时间差。
最后一行{1,3,4}{6,7,8} 满足ws,但是不满足gap=5 > maxgap。