机器学习(35)之PrefixSpan算法原理详解

2018 年 1 月 8 日 机器学习算法与Python学习

微信公众号

关键字全网搜索最新排名

【机器学习算法】:排名第一

【机器学习】:排名第一

【Python】:排名第三

【算法】:排名第四


前言

前面讲到频繁项集挖掘的关联算法Apriori(机器学习(22)之Apriori算法原理总结)和FP Tree(机器学习(31)之频繁集挖掘FP Tree详解),这两个算法都是挖掘频繁项集的。而今天要介绍的PrefixSpan(PrefixSpan算法的全称是Prefix-Projected Pattern Growth,即前缀投影的模式挖掘)算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标稍有不同。


项集数据和序列数据

首先看看项集数据和序列数据有什么不同,如下图所示。


左边的数据集就是项集数据,在Apriori和FP Tree算法中已经看到过,每个项集数据由若干项组成,这些项没有时间上的先后关系。而右边的序列数据则不一样,它是由若干数据项集组成的序列。比如第一个序列<a(abc)(ac)d(cf)>,它由a,abc,ac,d,cf共5个项集数据组成,并且这些项有时间上的先后关系。对于多于一个项的项集要加上括号,以便和其他的项集分开。同时由于项集内部是不区分先后顺序的,为了方便数据处理,一般将序列数据内所有的项集内部按字母顺序排序。


子序列和频繁序列

子序列和数学上的子集的概念很类似,也就是说,如果某个序列A所有的项集在序列B中的项集都可以找到,则A就是B的子序列。当然,如果用严格的数学描述,子序列是这样的:

对于序列A={a1,a2,...an}和序列B={b1,b2,...bm},n≤m,如果存在数字序列1≤j1≤j2≤...≤jn≤m, 满足a1⊆bj1,a2⊆bj2...an⊆bjn,则称A是B的子序列。当然反过来说, B就是A的超序列。

而频繁序列则与频繁项集很类似,也就是频繁出现的子序列。比如对于下图,支持度阈值定义为50%,也就是需要出现两次的子序列才是频繁序列。而子序列<(ab)c>是频繁序列,因为它是图中的第一条数据和第三条序列数据的子序列,对应的位置用蓝色标示。



PrefixSpan的一些基本概念

PrefixSpan算法的全称是Prefix-Projected Pattern Growth,即前缀投影的模式挖掘,里面有前缀和投影两个词。那么首先看看什么是PrefixSpan算法中的前缀prefix。


在PrefixSpan中的前缀prefix通俗意义讲就是序列数据前面部分的子序列。如果用严格的数学描述,前缀是这样的:对于序列A={a1,a2,...an}和序列B={b1,b2,...bm},n≤m,满足a1=b1,a2=b2...an−1=bn−1,而an⊆bn,则称A是B的前缀。比如对于序列数据B=<a(abc)(ac)d(cf)>,而A=<a(abc)a>,则A是B的前缀。当然B的前缀不止一个,比如<a>, <aa>, <a(ab)> 也都是B的前缀。


接下来再看看前缀投影,其实前缀投影就是这儿的后缀,前缀加上后缀就可以构成一个我们的序列。下面给出前缀和后缀的例子。对于某一个前缀,序列里前缀后面剩下的子序列即为我们的后缀。如果前缀最后的项是项集的一部分,则用一个“_”来占位表示。


下面这个例子展示了序列<a(abc)(ac)d(cf)>的一些前缀和后缀,还是比较直观的。要注意的是,如果前缀的末尾不是一个完全的项集,则需要加一个占位符。在PrefixSpan算法中,相同前缀对应的所有后缀的结合称为前缀对应的投影数据库。



PrefixSpan算法思想

PrefixSpan算法的目标是挖掘出满足最小支持度的频繁序列。那么怎么去挖掘出所有满足要求的频繁序列呢?回忆Aprior算法(机器学习(22)之Apriori算法原理总结),它是从频繁1项集出发,一步步的挖掘2项集,直到最大的K项集。PrefixSpan算法也类似,它从长度为1的前缀开始挖掘序列模式,搜索对应的投影数据库得到长度为1的前缀对应的频繁序列,然后递归的挖掘长度为2的前缀所对应的频繁序列,。。。以此类推,一直递归到不能挖掘到更长的前缀挖掘为止。

比如对应于上面的例子,支持度阈值为50%。里面长度为1的前缀包括<a>, <b>, <c>, <d>, <e>, <f>,<g>,需要对这6个前缀分别递归搜索找各个前缀对应的频繁序列。如下图所示,每个前缀对应的后缀也标出来了。由于g只在序列4出现,支持度计数只有1,因此无法继续挖掘。我们的长度为1的频繁序列为<a>, <b>, <c>, <d>, <e>,<f>。去除所有序列中的g,即第4条记录变成<e(af)cbc>。



现在开始挖掘频繁序列,分别从长度为1的前缀开始。这里我们以d为例子来递归挖掘,其他的节点递归挖掘方法和D一样。方法如下图,首先对d的后缀进行计数,得到{a:1, b:2, c:3, d:0, e:1, f:1,_f:1}。注意f和_f是不一样的,因为前者是在和前缀d不同的项集,而后者是和前缀d同项集。由于此时a,d,e,f,_f都达不到支持度阈值,因此我们递归得到的前缀为d的2项频繁序列为<db>和<dc>。接着分别递归db和dc为前缀所对应的投影序列。首先看db前缀,此时对应的投影后缀只有<_c(ae)>,此时_c,a,e支持度均达不到阈值,因此无法找到以db为前缀的频繁序列。现在来递归另外一个前缀dc。以dc为前缀的投影序列为<_f>, <(bc)(ae)>, <b>,此时进行支持度计数,结果为{b:2, a:1, c:1, e:1, _f:1},只有b满足支持度阈值,因此得到前缀为dc的三项频繁序列为<dcb>。继续递归以<dcb>为前缀的频繁序列。由于前缀<dcb>对应的投影序列<(_c)ae>支持度全部不达标,因此不能产生4项频繁序列。至此以d为前缀的频繁序列挖掘结束,产生的频繁序列为<d><db><dc><dcb>。同样的方法可以得到其他以<a>, <b>, <c>, <e>, <f>为前缀的频繁序列。


PrefixSpan算法流程

下面对PrefixSpan算法的流程做一个归纳总结。

输入:序列数据集S和支持度阈值α

输出:所有满足支持度要求的频繁序列集

1)找出所有长度为1的前缀和对应的投影数据库

2)对长度为1的前缀进行计数,将支持度低于阈值α的前缀对应的项从数据集S删除,同时得到所有的频繁1项序列,i=1.

3)对于每个长度为i满足支持度要求的前缀进行递归挖掘:

        a) 找出前缀所对应的投影数据库。如果投影数据库为空,则递归返回。

        b) 统计对应投影数据库中各项的支持度计数。如果所有项的支持度计数都低于阈值α,则递归返回。

        c)将满足支持度计数的各个单项和当前的前缀进行合并,得到若干新的前缀。

        d) 令i=i+1,前缀为合并单项后的各个前缀,分别递归执行第3步。


PrefixS算法总结

PrefixSpan算法由于不用产生候选序列,且投影数据库缩小的很快,内存消耗比较稳定,作频繁序列模式挖掘的时候效果很高。比起其他的序列挖掘算法比如GSP,FreeSpan有较大优势,因此是在生产环境常用的算法。


PrefixSpan运行时最大的消耗在递归的构造投影数据库。如果序列数据集较大,项数种类较多时,算法运行速度会有明显下降。因此有一些PrefixSpan的改进版算法都是在优化构造投影数据库这一块。比如使用伪投影计数。当然使用大数据平台的分布式计算能力也是加快PrefixSpan运行速度一个好办法。比如Spark的MLlib就内置了PrefixSpan算法。


不过scikit-learn始终不太重视关联算法,一直都不包括这一块的算法集成,这就有点落伍了。


欢迎分享给他人让更多的人受益

参考:

  1. 周志华《机器学习》

  2. 博客园

    http://www.cnblogs.com/pinard/p/6323182.html

  3. 李航《统计学习方法》


近期热文

2017年度盘点:Github上十大有趣的机器学习项目(文末有惊喜......)

干货 | 详解如何用深度学习消除背景,实现抠图

推荐 | 基于深度学习的图像语义分割方法回顾(附PDF下载)

精华 | 深度学习中的【五大正则化技术】与【七大优化策略】

机器学习(34)之BIRCH层次聚类详解

自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)

加入微信机器学习交流

请添加微信:guodongwe1991

备注姓名-单位-研究方向


广告、商业合作

请添加微信:guodongwe1991

(备注:商务合作)

登录查看更多
1

相关内容

数学上,序列是被排成一列的对象(或事件);这样每个元素不是在其他元素之前,就是在其他元素之后。这里,元素之间的顺序非常重要。
专知会员服务
139+阅读 · 2020年5月19日
【天津大学】知识图谱划分算法研究综述
专知会员服务
106+阅读 · 2020年4月27日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
354+阅读 · 2020年2月15日
【新书】Pro 机器学习算法Python实现,379页pdf
专知会员服务
198+阅读 · 2020年2月11日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
机器学习(30)之线性判别分析(LDA)原理详解
机器学习算法与Python学习
11+阅读 · 2017年12月6日
机器学习(29)之奇异值分解SVD原理与应用详解
机器学习算法与Python学习
5+阅读 · 2017年11月30日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
机器学习(26)之K-Means实战与调优详解
机器学习算法与Python学习
4+阅读 · 2017年11月19日
干货 | 深度学习之卷积神经网络(CNN)的前向传播算法详解
机器学习算法与Python学习
9+阅读 · 2017年11月17日
机器学习(23)之GBDT详解
机器学习算法与Python学习
12+阅读 · 2017年10月25日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
机器学习(13)之最大熵模型详解
机器学习算法与Python学习
7+阅读 · 2017年8月24日
详解个性化推荐五大最常用算法
量子位
4+阅读 · 2017年7月8日
Arxiv
26+阅读 · 2018年2月27日
VIP会员
相关VIP内容
专知会员服务
139+阅读 · 2020年5月19日
【天津大学】知识图谱划分算法研究综述
专知会员服务
106+阅读 · 2020年4月27日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
354+阅读 · 2020年2月15日
【新书】Pro 机器学习算法Python实现,379页pdf
专知会员服务
198+阅读 · 2020年2月11日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
相关资讯
机器学习(30)之线性判别分析(LDA)原理详解
机器学习算法与Python学习
11+阅读 · 2017年12月6日
机器学习(29)之奇异值分解SVD原理与应用详解
机器学习算法与Python学习
5+阅读 · 2017年11月30日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
机器学习(26)之K-Means实战与调优详解
机器学习算法与Python学习
4+阅读 · 2017年11月19日
干货 | 深度学习之卷积神经网络(CNN)的前向传播算法详解
机器学习算法与Python学习
9+阅读 · 2017年11月17日
机器学习(23)之GBDT详解
机器学习算法与Python学习
12+阅读 · 2017年10月25日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
机器学习(13)之最大熵模型详解
机器学习算法与Python学习
7+阅读 · 2017年8月24日
详解个性化推荐五大最常用算法
量子位
4+阅读 · 2017年7月8日
Top
微信扫码咨询专知VIP会员