PrefixSpan算法原理总结

前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree。这两个算法都是挖掘频繁项集的。而今天我们要介绍的PrefixSpan算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标稍有不同。

一、1. 项集数据和序列数据

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

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

二、子序列与频繁序列

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

    对于序列A={\(a_1,a_2,...a_n\)}和序列B={\(b_1,b_2,...b_m\)},\(n \leq m\),如果存在数字序列\(1 \leq j_1 \leq j_2 \leq ... \leq j_n \leq m\), 满足$a_1 \subseteq b_{j_1}, a_2 \subseteq b_{j_2}...a_n \subseteq b_{j_n} $,则称A是B的子序列。当然反过来说, B就是A的超序列。

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

三、PrefixSpan算法的一些概念

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

    在PrefixSpan算法中的前缀prefix通俗意义讲就是序列数据前面部分的子序列。比如对于序列数据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算法的思想,PrefixSpan算法的目标是挖掘出满足最小支持度的频繁序列。那么怎么去挖掘出所有满足要求的频繁序列呢。回忆Aprior算法,它是从频繁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和支持度阈值\(\alpha\)

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

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

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

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

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

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

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

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

六、PrefixSpan算法小结

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

    PrefixSpan运行时最大的消耗在递归的构造投影数据库。如果序列数据集较大,项数种类较多时,算法运行速度会有明显下降。因此有一些PrefixSpan的改进版算法都是在优化构造投影数据库这一块。比如使用伪投影计数。

    当然使用大数据平台的分布式计算能力也是加快PrefixSpan运行速度一个好办法。比如Spark的MLlib就内置了PrefixSpan算法。

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

 

(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)

转载于:https://www.cnblogs.com/nickchen121/p/11214773.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何下载python模块_Python第三方库(模块)下载和安装(使用pip命令)

进行 Python 程序开发时&#xff0c;除了使用 Python 内置的标准模块以及我们自定义的模块之外&#xff0c;还有很多第三方模块可以使用&#xff0c;这些第三方模块可以借助 Python官方提供的查找包页面&#xff08;https://pypi.org/&#xff09;找到。 使用第三方模块之前&am…

GODADDY主机用tar命令通过SSH远程打包20M以上的文件

GODADDY的虚拟主机控制面板虽然使用起来非常方便&#xff0c;对于文件管理的很多操作也非常到位&#xff0c;但是有一个非常令人头疼的问题&#xff0c;就是GODADDY在 主机控制面板中只支持小于20M的文件打包&#xff0c;这对于大部分的站长朋友来说&#xff0c;是非常不方便的…

python链表怎么定义_python:链表定义以及实现

链表&#xff08;linked list&#xff09;是一组数据项的集合&#xff0c;其中每个数据项都是一个节点的一部分&#xff0c;每个节点还包含指向下一个节点的链接. 链表的数据结构如下图所示在链表中删除操作可以通过修改指针来实现,如下图所示:插入则是调整,插入点的前后两个指…

安卓注册手机短信验证码验证的案例-01

为了实现注册手机验证验证码 在网上百度了许久的注册手机验证码发送验证的案例要么是太过时要么就是不能用了 在此把我最近几天研究的成果发到这里希望 能够给遇到相同问题的人给予帮助 首先看看运行的效果图&#xff1a; 简单的介绍下博主用的是mod 的sdk来短信验证 使用的…

Gym - 100543L

Gym - 100543Lhttps://vjudge.net/problem/153854/origin区间dp&#xff0c;要从区间长度为1开始dp #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #in…

安卓注册手机短信验证码验证的案例-02

本部分我们将讲述如何实现手机注册验证码的代码 首先我们得有一个验证码的界面如下图所示&#xff1a; 代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/an…

推荐阅读《大话设计模式》的策划编辑陈禹成写的新书《电脑使用说明书》

三年前&#xff0c;我很幸运能与陈禹成&#xff08;当年叫陈冰&#xff0c;曾是清华大学出版社策划编辑&#xff09;合作&#xff0c;完成了《大话设计模式》的创作和出版工作。应该说&#xff0c;没有陈禹成的帮助&#xff0c;也不可能有《大话设计模式》的成功。非常感谢他&a…

c# asp.net mvc 开发的正方教务助手(一)

在网上百度了很多模拟登陆教务教务助手的教程 要么是java要么是php要么就是python 难得查找到一个c#的结果又是客户端的&#xff0c;一个网页版的都没看到 于是楼主决定在研究&#xff0c;自行写一个网页版方正教务助手 历时一个星期终于完成&#xff0c;效果如下所示&…

c# asp.net mvc 开发的正方教务助手(二)

在上一篇文章展示了项目实际运行情况 现在我们来分析该项目如何完成的&#xff1a; 第一步&#xff1a;登陆你们的教务&#xff0c;这是我们学习的教务的主页http://jw.svtcc.edu.cn/Default2.aspx&#xff0c;进去之后&#xff0c;打开使用火狐浏览器进行登陆分析 在火狐浏览…

单独安装想要的office_安装OFFICE不再求人,最省心的方法

强烈建议选择office部署工具Office Tool Plus 不建议选择微软官方的office 2016部署工具 因为还需要手动更改代码&#xff0c;不利于新手安装。office tool plus它能够帮助用户轻松的在线下载安装 Office 的各个版本&#xff0c;安装过程中用户可以自由选择安装哪些需要使用的组…

{php mysql}

###1.连接数据库服务器函数&#xff08;2个&#xff09;&#xff1a; mysql_connect,mysql_pconnect (1).mysql_connect() 格式&#xff1a;int mysql_connect(string [hostname] [:port],string [username],string [password]); hostname // * 服务器名username // * 服务器…

C# MVC的博客开发(一)登录

由于前端使用的是layui的模板&#xff0c;该模板自带登录和注册页面&#xff0c;但是此页面的登录和普通页面的登录有些不同登录后返回的数据也需要处理&#xff0c;这里我来整理下layui登录时候遇到的问题首先登录提交数据的js我们在login.html并没有找到&#xff0c;form提交…

C# MVC的博客开发(二)登录

解决了登录数据在哪里提交的问题我们进行后台的登录的编写和实现后台登录代码我就不详细讲解了就是把传输过去的数据和数据库进行匹配如果存在就返回一个值如果不存在就另外一个值但是登录的时候我们可能遇到用户输入的用户密码不对或者其他的错误&#xff0c;官网的首页输入密…

ASP.NET知识结构

ASP.NET知识结构 https://blog.csdn.net/yaolong168888/article/details/80126541 转载于:https://www.cnblogs.com/iamspecialone/p/11220086.html

C# MVC的博客开发(三)注册

在做注册的时候博主遇到了个很坑爹的问题 那就是本地发送邮件正常可是搬运到阿里云服务器发送邮件就gg了查询了很久才知道阿里云默认是把25发送邮件端口给封了 也就是说放在阿里云服务器的发送邮件是无法以无ssl加密的方式发送的&#xff0c;必须通过ssl家里的465端口去发送邮件…

python中if有几种使用方式_python 中if-else的多种简洁的写法

原博文 2017-11-02 15:18 − 因写多了判断语句&#xff0c;看着短短的代码却占据来好几行&#xff0c;于是便搜下if-else简洁的写法&#xff0c;结果也是发现新大陆 4种&#xff1a; 第1种:__就是普通写法 a, b, c 1, 2, 3 if a>b: c a else: c b 第二种&#xff1a;一行…

python多行字符串输入_python中怎么输入多行字符串

Python中输入多行字符串&#xff1a; 方法一&#xff1a;使用三引号>>> str1 Le vent se lve, il faut tenter de vivre. 起风了&#xff0c;唯有努力生存。 &#xff08;纵有疾风起&#xff0c;人生不言弃。&#xff09; >>> str1 Le vent se lve, il faut…

C# MVC使用阿里云对象存储加快图片加载速度(一)

公司有个点餐的项目有大量的图片需要在扫码后的网页进行加载&#xff0c;刚开始使用的客户少的时候公司的4核8G&#xff0c;5M带宽的服务器还能挺快的加载图片和网页&#xff0c;但是客户一多&#xff0c;由于客户大多是快餐行业的&#xff0c;中午点餐的人数是相当多的&#x…

css background 充满自适应_剖析一些经典的CSS布局问题,为前端开发+面试保驾护航...

一、让一个元素水平垂直居中&#xff0c;到底有多少种方案&#xff1f;水平居中对于 行内元素: text-align: center;对于确定宽度的块级元素&#xff1a;width和margin实现。margin: 0 auto;绝对定位和margin-left: -width/2, 前提是父元素position: relative对于宽度未知的块级…

.net Redis缓存优化提高加载速度和服务器性能(二)

上文详细测试了每次都读取数据库的接口和通过缓存读取接口的性能对比 这里我们就准备实际简介肿么将原来的数据库加上Redis缓存优化部分接口 1.下载Redis和Redis视图管理工具 点击下载 提取码: 9tgg 备用下载地址 下载完成后先安装Redis再安装Redis视图管理工具 打开…