频繁模式挖掘

(先声明一下,文章内容可能你在网上也能找到,但是我参考了几篇文章的优势,使得算法更容易理解)

Apriori算法

Apriori算法是一个经典的数据挖掘算法,Apriori的单词的意思是"先验的",说明这个算法是具有先验性质的,就是说要通过上一次的结果推导出下一次的结果,这个如何体现将会在下面的分析中会慢慢的体现出来。Apriori算法的用处是挖掘频繁项集的,频繁项集粗俗的理解就是找出经常出现的组合,然后根据这些组合最终推出我们的关联规则。

Apriori算法原理

Apriori算法是一种逐层搜索的迭代式算法,其中k项集用于挖掘(k+1)项集,这是依靠他的先验性质的:

频繁项集的所有非空子集一定是也是频繁的;

如果一个项集是非频繁的,那么它所有的超集也是非频繁的。

通过这个性质可以对候选集进行剪枝。用k项集如何生成(k+1)项集呢,这个是算法里面最难也是最核心的部分。通过2个步骤:

1、连接步,将频繁项自己与自己进行连接运算。

2、剪枝步,去除候选集项中的不符合要求的候选项,不符合要求指的是这个候选项的子集并非都是频繁项,要遵守上文提到的先验性质。

3、通过1,2步骤还不够,在后面还要根据支持度计数筛选掉不满足最小支持度数的候选集。首先是测试数据:

交易ID

商品ID列表

T100

I1,I2,I5

T200

I2,I4

T300

I2,I3

T400

I1,I2,I4

T500

I1,I3

T600

I2,I3

T700

I1,I3

T800

I1,I2,I3,I5

T900

I1,I2,I3

算法的步骤图

最后我们可以看到频繁3项集的结果为{1, 2, 3}和{1, 2, 5},然后我们去后者{1,2,5}作为频繁项集来生产他的关联规则,但是在这之前得先知道一些概念,怎么样才能够成为一条关联规则,关有频繁项集还是不够的。

关联规则

Support(支持度):项集在给定数据集里出现的频繁程度。

confidence(置信度):confidence的中文意思为自信的,在这里其实表示的是一种条件概率,当在A条件下,B发生的概率就可以表示为confidence(A->B)=p(B|A),意为在A的情况下,推出B的概率。

最小置信度阈值:按照字面上的意思就是限制置信度值的一个限制条件嘛,这个很好理解。

强规则:强规则就是指的是置信度满足最小置信度(就是>=最小置信度)的推断就是一个强规则,也就是文中所说的关联规则了。这个在下面的程序中会有所体现。

FP树算法

FP-Tree算法全称是FrequentPatternTree算法,就是频繁模式树算法,他与Apriori算法一样也是用来挖掘频繁项集的,不过不同的是,FP-Tree算法是Apriori算法的优化处理,他解决了Apriori算法在过程中会产生大量的候选集的问题,而FP-Tree算法则是发现频繁模式而不产生候选集。但是频繁模式挖掘出来后,产生关联规则的步骤还是和Apriori是一样的。

FP树构造

FP Growth算法利用了巧妙的数据结构,大大降低了Apriori挖掘算法的代价,它不需要不断地生成候选项目队列和不断得扫描整个数据库进行比对。为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树)。请看下面这个例子:

先看数据集如下:

这张表描述了一张商品交易清单,abcdefg…代表商品,(ordered)frequentitems这一列是把商品按照出现频率降序重新进行了排列,这个排序很重要,我们操作的所有项目必须按照这个顺序来,由于那些非频繁的项目在整个挖掘中不起任何作用,因此在这一列中排除了这些非频繁项目。我们在这个例子中设置最小支持阈值(minimum support threshold)为3。我们的目标是为整个商品交易清单构造一颗树。

我们首先定义这颗树的根节点为null,然后我们开始扫描整个数据库的每一条记录开始构造FP树。

第一步:扫描数据库的第一个交易,也就是TID为100的交易。那么就会得到这颗树的第一个分支<(f:1),(c:1),(a:1),(m:1),(p:1)>。注意这个分支一定是要按照降频排列的。

第二步:扫描第二条交易记录(TID=200),我们会有这么一个频繁项目集合<f,c,a,b,m>。仔细观察这个队列,你会发现这个集合的前3项<f,c,a>与第一步产生的路径<f,c,a,m,p>的前三项是相同的,也就是说他们可以共享一个前缀。于是我们在第一步产生的路径的基础上,把<f,c,a>三个节点的数目加1,然后将<(b:1),(m:1)>作为一个分支加在(a:2)节点的后面,成为它的子节点。看下图:

第三步:接着扫描第三条交易记录(TID=300),你会看到这条记录的集合是<f, b>,与已存在的路径相比,只有f是共有的前缀,那么f节点加1,同时再为f节点生成一个新的字节点(b:1)。就会有下图:

第四步:继续看第四条交易记录,它的集合是<c,b,p>,哦,这回不一样了。你会发现这个集合的第一个元素是c,与现存的已知路径的第一个节点f不一样,那就不用往下比了,没有任何公共前缀。直接将该集合作为根节点的子路径附加上去。就得到了下图:

第五步:最后一条交易记录来了,你看到了一条集合<f,c,a,m,p>。你惊喜得发现这条路径和树现有最左边的路径竟然完全一样。那么,这整条路径都是公共前缀,那么这条路径上的所有点都加1好了。就得到了最终的图。

好了,一颗FP树就已经基本构建完成了。等等还差一点。上述的树还差一点点就可以称之为一个完整的FP树。为了便于后边的树的遍历,我们为这棵树又增加了一个结构-头表,头表保存了所有的频繁项目,并且按照频率的降序排列,表中的每个项目包含一个节点链表,指向树中和它同名的节点。罗嗦了半天,可能还是不清楚,好吧直接上图,一看你就明白:

以上就是整个FP树构造的完整过程。

FP树的挖掘

下面就是最关键的了。我们已经有了一个非常简洁的数据结构,下一步的任务就是从这棵树里挖掘出我们所需要的频繁项目集合而不需要再访问数据库了。还是看上面的例子。

第一步:我们的挖掘从头表的最后一项p开始,那么一个明显的直接频繁集是(p:3)了。根据p的节点链表,它的2个节点存在于2条路径当中:路径<f:4,c:3,a:3,m:2,p:2>和路径<c:1,b:1,p:1>。从路径<f:4,c:3,a:3,m:2,p:2>我们可以看出包含p的路径<f,c,a,m,p>出现了2次,同时也会有<f,c,a>出现了3次,<f>出现了4次。但是我们只关注<f,c,a,m,p>,因为我们的目的是找出包含 p的所有频繁集合。同样的道理我们可以得出<c,b,p>在数据库中出现了1次。于是,p就有2个前缀路径{(fcam:2), (cb:1)}。这两条前缀路径称之为p的子模式基(subpattern-base),也叫做p的条件模式基(之所以称之为条件模式基是因为这个子模式基是在p存在的前提条件下)。接下来我们再为这个条件子模式基构造一个p的条件FP树。再回忆一下上面FP树的构造算法,很容易得到下面这棵树:

但是由于频繁集的阈值是3。那么实际上这棵树经过剪枝之后只剩下一个分支(c:3),所以从这棵条件FP树上只能派生出一个频繁项目集{cp:3}。加上直接频繁集(p:3)就是最后的结果.

第二步:我们接下来开始挖掘头表中的倒数第二项m,同第一步一样,显然有一个直接的频繁集(m:3)。再查看它在FP树中存在的两条路径<f:4,c:3,a:3,m:2>和<f:4,c:3,a:3,b1,m:1>。那么它的频繁条件子模式基就是{ (fca:2),(fcab:1)}。为这个子模式基构造FP树,同时舍弃不满足最小频繁阈值的分支b,那么其实在这棵FP树中只存在唯一的一个频繁路径<f:3,c:3,a:3>。既然这颗子FP树是存在的,并且不是一颗只有一个节点的特殊的树,我们就继续递归得挖掘这棵树。这棵子树是单路径的子树,我们可以简化写成mine(FP tree|m)=mine(<f:3,c:3,a:3>|m:3)。

下面来阐述如何挖掘这颗FP子树,我们需要递归。递归子树也需要这么几个步骤:

1 这颗FP子树的头表最后一个节点是a,结合递归前的节点m,那么我们就得到am的条件子模式基{(fc:3)},那么此子模式基构造的FP树(我们称之为 m的子子树)实际上也是一颗单路径的树<f:3,c:3>,接下也继续继续递归挖掘子子树 mine(<f:3,c:3>|am:3)。 (子子树的递归分析暂时打住。因为再分析子子树的递归的话文字就会显得太混乱)

2 同样,FP子树头表的倒数第二个节点是c,结合递归前节点m,就有我们需要递归挖掘mine(<f:3>|cm:3)。

3 FP子树的倒数第三个节点也是最后一个节点是f,结合递归前的m节点,实际上需要递归挖掘mine(null|fm:3),实际上呢这种情况下的递归就可以终止了,因为子树已经为空了。因此此情况下就可以返回频繁集合<fm:3>

注意:这三步其实还包含了它们直接的频繁子模式<am:3>,<cm:3>,<fm:3>,这在每一步递归调用mine<FPtree>都是一样的,就不再罗嗦得一一重新指明了。

实际上这就是一个很简单的递归过程,就不继续往下分析了。

mine(<f:3,c:3>|am:3)=><cam:3>,<fam:3>,<fcam:3>

mine(<f:3>|cm:3)=><fcm:3>

mine(null|fm:3)=><fm:3>

这三步还都包含了各自直接的频繁子模式<am:3>,<cm:3>,<fm:3>。

最后再加上m的直接频繁子模式<m:3>,就是整个第二步挖掘m的最后的结果。

第三步:来看看头表倒数第三位<b:3>的挖掘,它有三条路径<f:4,c:3,a:3,b:1>,<f:4,b:1>,<c:1,b:1>,形成的频繁条件子模式基为 {(fca:1),(f:1),(c:1)},构建成的FP树中的所有节点的频率均小于3,那么FP树为空,结束递归.这一步得到的频繁集就只有直接频繁集合<b:3>

第四步:头表倒数第四位<a:3>,它有一条路径<f:4,c:3>,频繁条件子模式基为{(fc:3)},构成一个单路径的FP树.实际上可能有人早已经发现了,这种单路径的FP树挖掘其实根本不用递归这么麻烦,只要进行排列组合就可以直接组成最后的结果.实际上也确实如此.那么这一步最后的结果根据排列组合就有:{(fa:3),(ca:3),(fca:3),(a:3)}

第五步:头表的倒数第五位<c:4>,它只有一条路径<f:4>,频繁条件子模式基为{(f:3)},那么这一步的频繁集也就很明显了:{(fc:3),(c:4)}

第六步:头表的最后一位<f:4>,没有条件子模式基,那么只有一个直接频繁集{(f:4)}

这6步的结果加在一起,就得到我们所需要的所有频繁集.下图给出了每一步频繁条件模式基.

其实,通过上面的例子,估计早有人看出来了,这种单路径的FP树挖掘其实是有规律的,根本不用递归这么复杂的方法,通过排列组合可以直接生成。的确如此,针对这种单路径的情况作了优化。如果一颗FP树有一个很长的单路径,我们将这棵FP树分成两个子树:一个子树是由原FP树的单路径部分组成,另外一颗子树由原FP树的除单路径之外的其余部分组成。对这两个子树分别进行FP Growth算法,然后对最后的结果进行组合就可可以了。

mahout探索之旅---频繁模式挖掘算法与理解相关推荐

  1. 数据挖掘-关联分析频繁模式挖掘Apriori、FP-Growth及Eclat算法的JAVA及C++实现

    (update 2012.12.28 关于本项目下载及运行的常见问题 FAQ见 newsgroup18828文本分类器.文本聚类器.关联分析频繁模式挖掘算法的Java实现工程下载及运行FAQ ) 一. ...

  2. 【数据挖掘】频繁模式挖掘及Python实现

    1.理论背景 在美国,著名的沃尔玛超市发现啤酒与尿布总是共同出现在购物车中,于是沃尔玛超市经过分析发现许多美国年轻的父亲下班之后经常要去购买婴儿的尿布,而在购买尿布的同时,他们往往会顺手购买一些啤酒: ...

  3. 数据挖掘(一)频繁模式挖掘算法的实现和对比

    注:参考多篇CSDN文章所得 一.实验内容 巩固频繁模式挖掘的基本算法原理及特点,设计程序,基于不同特征的数据集比较不同方法的优缺点,并基于算法原理和特点分析造成这种现象的原因. 二.算法原理 1 A ...

  4. 频繁模式挖掘Frequent Pattern Mining

    频繁模式挖掘(Frequent Pattern Mining): 频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题.建议用户参考维基百科的association r ...

  5. 频繁模式挖掘——概述

    频繁模式挖掘(Frequent Pattern Mining) 基本概念 a. 频繁模式(frequent pattern)是频繁地出现在数据集中的模式(如项集.子序列或子结构). 例如: i. 频繁 ...

  6. apriori java_频繁模式挖掘apriori算法介绍及Java实现

    频繁模式是频繁地出如今数据集中的模式(如项集.子序列或者子结构).比如.频繁地同一时候出如今交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B) ...

  7. Log Cluster:日志数据聚类和模式挖掘算法

    摘要:现代 IT 系统经常产生大量事件日志,事件模式发现就成了重要的日志管理任务.为完成此目标,数据挖掘方法已经预先给出了很多方式.本文提出 Log Cluster 算法,其继承了文本事件日志数据聚类 ...

  8. 机器学习1:关联分析及频繁模式挖掘Association rule mining(基于R language)

      关联分析是一种无监督的机器学习方法,常用于知识发现而非预测.本文从以下几个方面进行叙述: 频繁项 Frequent Patterns 关联挖掘方法 Association Mining Metho ...

  9. 频繁模式挖掘 Apriori

    原文地址:http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html 1. 挖掘关联规则 1.1   什么是关联规则 一言蔽之,关联规则是形如X→Y的蕴涵 ...

最新文章

  1. 5.7-基于Binlog+Position的复制搭建
  2. 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)
  3. 《R语言实战》读书笔记--第一章 R语言介绍
  4. AngularJs 抓狂之: $q promise 自动unwarp功能被禁用了
  5. 如何在VS2013中进行Boost单元测试
  6. Roman and Browser-罗曼的浏览器 CodeForce1100A 暴力
  7. 游族内部信:年终奖如期发放 继续招聘全球化游戏人才
  8. 大数据_MapperReduce_从CSV文件中读取数据到Hbase_测试---Hbase工作笔记0022
  9. 燕姿几首歌的歌词-偶得
  10. excel数据导入matlab失败,Excel数据导入matlab
  11. 聊天室应用开发实践(二):实现基于 Web 的聊天室
  12. 我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】
  13. 金网奖首度跨界心理学,打造最强案例
  14. 3DMax 建模注意点(二)
  15. Python 汽车之家 车型销量--参数分析与实现
  16. Metrics 简介
  17. 银河麒麟系统共享打印机方法
  18. 探索TP6验证场景的only、remove、append规则
  19. HTML5绘制国际象棋,如何用纯CSS实现一副国际象棋
  20. SSM3==理解静态代理、动态代理Proxy.newProxyInstance、cglib代理==通过纯XML配置spring AOP,通过纯注解配置spring AOP

热门文章

  1. 小程序授权第三方平台
  2. 安卓默认打开指定apk的无障碍权限
  3. 揭秘:“苏宁拼购基地”落地全国的原因
  4. 微信小程序封装图片合成水印
  5. Kotlin - 面向对象之抽象类与接口
  6. 自动锁定计算机快捷键,教你电脑锁屏怎么设置,让电脑自动锁屏
  7. 一年有50万主播入驻淘宝,宇宙的尽头是编制,直播的尽头是淘宝?
  8. C#获取汉字拼音或首字母
  9. 实现调用本地office打开在线文档功能
  10. 【易择微信系列7】玩转语音