一、 算法简介
序列模式定义:给定一个由不同序列组成的集合,其中,每个序列由不同的元素按顺序有序排列,每个元素由不同项目组成,同时给定一个用户指定的最小支持度阈值,序列模式挖掘就是找出所有的频繁子序列,即该子序列在序列集中的出现频率不低于用户指定的最小支持度阈值。
GSP是序列模式挖掘的一种算法。其主要描述如下:
l 根据长度为i 的种子集Li 通过连接操作和剪切操作生成长度为i+1的候选序列模式Ci+1;然后扫描序列数据库,计算每个候选序列模式的支持数,产生长度为i+1的序列模式Li+1,并将Li+1作为新的种子集。
l 重复第二步,直到没有新的序列模式或新的候选序列模式产生为止。
l 扫描序列数据库,得到长度为1的序列模式L1,作为初始的种子集
L 1 Þ C 2 Þ L 2 Þ C 3 Þ L 3 Þ C 4 Þ L4 Þ ……
产生候选序列模式主要分两步
l 连接阶段:如果去掉序列模式s1的第一个项目与去掉序列模式s2的最后一个项目所得到的序列相同,则可以将s1于s2进行连接,即将s2的最后一个项目添加到s1中。
l 剪切阶段:若某候选序列模式的某个子序列不是序列模式,则此候选序列模式不可能是序列模式,将它从候选序列模式中删除。
候选序列模式的支持度计算:对于给定的候选序列模式集合C,扫描序列数据库,对于其中的每一条序列d,找出集合C中被d所包含的所有候选序列模式,并增加其支持度计数。
二、 算法的设计和实现
本算法采用Java实现,主要根据序列模式的情况,序列模式挖掘中共涉及到这样个3对象,序列、元素和项目,这样算法共有5个类:
GSP类:算法核心类,GSP算法的核心操作:连接和剪枝操作都在这里实现,在使用该算法时,也是需要通过使用该类的方法来实现GSP算法。
Sequence类:序列类,该类封装了序列的基本信息和基本操作,实现了对序列间的比较以及序列中的项目集操作。
Element类:元素类,在序列模式中元素也就是项目集,项目集中包含了项目,在本算法实现中,元素类中含有一个项目集属性,用于表示项目集,在使用时也是使用该属性来表示项目集,另外,在该类中还封装了对项目的操作以及一些其他操作。
SeqDB类:该类用于从数据库中扫描获取序列,本算法主要用于模拟实现,所以在程序中已经初始化了序列。
GSPTest类:测试类,使用JUnit对算法进行单元测试,本文附的代码只含有对于实现GSP算法的方法测试。
由于程序中附带了对方法的注释,这里对各个方法的原理和实现就不作介绍。
三、 实验结果
(一)实验数据
<{1 5}{2}{3}{4}>
<{1}{3}{4}{3 5}>
<{1}{2}{3}{4}>
<{1}{3}{5}>
<{4}{5}>
(二)程序输出
最小支持度计数为:2
输入的序列集合为:
[<(1,5) 2 3 4>, <1 3 4 (3,5)>, <1 2 3 4>, <1 3 5>, <4 (4,5)>]
序列模式L(1) 为:[<2>, <4>, <1>, <3>, <5>]
.................................................
剪枝前候选集的大小为:40 候选集c为:[<(2,2)>, <2 2>, <(2,4)>, <2 4>, <4 2>, <(1,2)>, <2 1>, <1 2>, <(2,3)>, <2 3>, <3 2>, <(2,5)>, <2 5>, <5 2>, <(4,4)>, <4 4>, <(1,4)>, <4 1>, <1 4>, <(3,4)>, <4 3>, <3 4>, <(4,5)>, <4 5>, <5 4>, <(1,1)>, <1 1>, <(1,3)>, <1 3>, <3 1>, <(1,5)>, <1 5>, <5 1>, <(3,3)>, <3 3>, <(3,5)>, <3 5>, <5 3>, <(5,5)>, <5 5>]
剪枝后候选集的大小为:40 候选集c为:[<(2,2)>, <2 2>, <(2,4)>, <2 4>, <4 2>, <(1,2)>, <2 1>, <1 2>, <(2,3)>, <2 3>, <3 2>, <(2,5)>, <2 5>, <5 2>, <(4,4)>, <4 4>, <(1,4)>, <4 1>, <1 4>, <(3,4)>, <4 3>, <3 4>, <(4,5)>, <4 5>, <5 4>, <(1,1)>, <1 1>, <(1,3)>, <1 3>, <3 1>, <(1,5)>, <1 5>, <5 1>, <(3,3)>, <3 3>, <(3,5)>, <3 5>, <5 3>, <(5,5)>, <5 5>]
序列模式L(2) 为:[<2 4>, <1 2>, <2 3>, <1 4>, <3 4>, <4 5>, <1 3>, <1 5>, <3 5>]
.................................................
剪枝前候选集的大小为:18 候选集c为:[<1 (2,4)>, <1 2 4>, <2 (4,5)>, <2 4 5>, <1 (2,3)>, <1 2 3>, <2 (3,4)>, <2 3 4>, <2 (3,5)>, <2 3 5>, <1 (4,5)>, <1 4 5>, <3 (4,5)>, <3 4 5>, <1 (3,4)>, <1 3 4>, <1 (3,5)>, <1 3 5>]
剪枝后候选集的大小为:7 候选集c为:[<1 2 4>, <1 2 3>, <2 3 4>, <1 4 5>, <3 4 5>, <1 3 4>, <1 3 5>]
序列模式L(3) 为:[<1 2 4>, <1 2 3>, <2 3 4>, <1 3 4>, <1 3 5>]
.................................................
剪枝前候选集的大小为:2 候选集c为:[<1 2 (3,4)>, <1 2 3 4>]
剪枝后候选集的大小为:1 候选集c为:[<1 2 3 4>]
序列模式L(4) 为:[<1 2 3 4>]
.................................................
计算花费时间60毫秒!
四、程序源代码
(一)GSP类
package gsp;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/**
* <title>GSP算法实现类</title>
* 本类为核心类,在本类中实现了GSP算法
* @author guangqingzhong
*
*/
public class GSP {
private ArrayList<Sequence> c; //长度为i的候选序列模式
private ArrayList<Sequence> l; //长度为i的序列模式
private ArrayList<Sequence> result;
private SeqDB db;
private int support;
/**