前段时间,由于项目中用到了序列挖掘的算法,师兄推荐我用用SPMF。在此做个记录。
首先简单介绍一下SPMF:
SPMF是一个采用Java开发的开源数据挖掘平台。
它提供了51种数据挖掘算法实现,用于:
- 序列模式挖掘,
- 关联规则挖掘,
- frequent itemset 挖掘,
- 顺序规则挖掘,
- 聚类
首先还是学习一下序列挖掘的有关概念:
所谓序列模式,我的定义是:在一组有序的数据列组成的数据集中,经常出现的那些序列组合构成的模式。跟我们所熟知的关联规则挖掘不一样,序列模式挖掘的对象以及结果都是有序的,即数据集中的每个序列的条目在时间或空间上是有序排列的,输出的结果也是有序的。 举个简单的例子来说明,关联规则一个经典的应用是计算超市购物中被共同购买的商品,它把每个顾客的一次交易视作一个transaction,计算在不同transaction中不同item组合的规律性。而如果我们考虑一个用户多次在超市购物的情况,那么这些不同时间点的交易记录就构成了一个购买序列,N个用户的购买序列就组成一个规模为N的序列数据集。考虑这些时间上的因素之后,我们就能得到一些比关联规则更有价值的规律,比如关联挖掘经常能挖掘出如啤酒和尿布的搭配规律,而序列模式挖掘则能挖掘出诸如《育儿指南》->婴儿车这样带有一定因果性质的规律。所以,序列模式挖掘比关联挖掘能得到更深刻的知识。 在实际当中,序列模式挖掘被广泛地应用于各种序列数据集中,如生物信息学上的基因微阵列数据,从中挖掘哪些基因组合模式在某类病人中会频繁出现;以单词作为item的文档序列,研究在不同文档中单词序列的出现模式;用户点击流数据,用于挖掘用户的频繁点击模式,建立用户模型,完善网站功能与UI结构。除此之外还有很多,只要是序列数据集,都可以考虑利用序列模式挖掘获得规律。 图1是一个序列数据库,及其以0.75作为最小阈值(min_sup)的频繁序列模式。借此介绍序列挖掘中的几个主要概念。
图1 简单的序列数据库,基本概念
序列(Sequence):以SID表示,一个序列即是一个完整的信息流。 项目(Item):序列中最小组成单位的集合,比如在这个样例中的项目为{A, B, C}。 事件(Event):通常用时间戳标志,标识事件之间的前后关系。又叫Itemset,是Item的集合,样例中以EID表示。 k频繁序列:如果频繁序列的项目个数为k,则称之为k频繁序列,以Fk表示(图1的F1,F2,F3)。 序列的包含关系:对于序列x和y,如果存在着一个保序的映射,使得x中的每个事件都被包含于y中的某个事件,则称为x被包含于y(x是y的子序列),例如序列B->AC是序列AB->E->ACD的子序列。 支持度(support):某序列x的支持度是指在整个序列集中包含x的序列的频次。 有了以上概念之后,序列模式挖掘的问题就定义为:给定一个序列数据库以及最小支持度min_sup,找出所有支持度大于min_sup的序列模式。 (引自:http://www.360doc.com/content/11/0924/09/7511080_150810319.shtml)
MaxSP算法介绍:(来自spmf中,MaxSP算法ppt中的例子)
也就是说,我在有一个上图的database的情况下,可以利用算法挖掘出支持度大于minsup的pattern。
可以看到,算法找出的是最大序列模式——maximal sequential patterns
首先对pattern做了分类:1:sequential patterns;2:closed patterns;3:maximal patterns
如何判断是否为最大Maximal呢?
什么意思呢?如下例子:
因为有{{a},{g}},所以虽然{{a}}的支持度大于minsup,但还是不会被输出,因为他不是maximal。
以使用MaxSP算法为例,来介绍SPMF的使用:
Algorithm——算法说明pdf+ppt下载下来
打开ppt可以看到对MaxSP的介绍:(ppt和pdf的内容基本相同)
download——源码,jar包
document——example
找到MaxSP即可看到算法说明:
里面说了有三种方式可以执行算法:
1:可视化的界面:http://www.philippe-fournier-viger.com/spmf/how_to_run_graphical_interface.php
2:命令行运行;
3:IDE中,直接copyMainTestMaxSP_saveToFile.java
如果你用的是eclipse的话,只需要把输入按照规定的格式改好,然后做一下简单的修改就可以用啦。
这里附上demo供大家参考:https://github.com/XBWer/SPMF_MaxSP