关联规则挖掘的原理和过程

从关联规则(一)的分析中可知,关联规则挖掘是从事务集合中挖掘出这样的关联规则:它的支持度和置信度大于最低阈值(minsup,minconf),这个阈值是由用户指定的。根据
support=(X,Y).count/T.countsupport=(X,Y).count/T.countsupport=(X,Y).count/T.count

confidence=(X,Y).count/X.countconfidence=(X,Y).count/X.countconfidence=(X,Y).count/X.count

要想找出满足条件的关联规则,首先必须找出这样的集合F=X∪YF=X \cup YF=X∪Y ,它满足F.count/T.count≥minsupF.count/T.count \geq minsupF.count/T.count≥minsup,其中F.countF.countF.count是TTT中包含FFF的事务的个数,然后再从FFF中找出这样的蕴含式X→YX\to YX→Y,它满足(X,Y).count/X.count≥minconf(X,Y).count/X.count ≥ minconf(X,Y).count/X.count≥minconf,并且X=F−YX=F-YX=F−Y。我们称像FFF这样的集合称为频繁项目集,假如FFF中的元素个数为kkk,我们称这样的频繁项目集为k−频繁项目集k-频繁项目集k−频繁项目集,它是项目集合III的子集。所以关联规则挖掘可以大致分为两步:

  1. 从事务集合中找出频繁项目集;
  2. 从频繁项目集合中生成满足最低置信度的关联规则。

通俗的理解:
频繁项集所依赖的支持度其实就是覆盖率。
关联规则所依赖的可信度其实就是条件概率。

用于求解关联规则频繁项集的算法较为常用的有三种:

  1. Apriori
  2. FP-Growth
  3. Eclat

本章节主要介绍Apriori算法。

Apriori算法

最出名的关联规则挖掘算法是Apriori算法,它主要利用了向下封闭属性:如果一个项集是频繁项目集,那么它的非空子集必定是频繁项目集。它先生成1-频繁项目集,再利用1-频繁项目集生成2-频繁项目集。。。然后根据2-频繁项目集生成3-频繁项目集…依次类推,直至生成所有的频繁项目集,然后从频繁项目集中找出符合条件的关联规则。

下面来讨论一下频繁项目集的生成过程,它的原理是根据k−频繁项目集k-频繁项目集k−频繁项目集生成(k+1)−频繁项目集(k+1)-频繁项目集(k+1)−频繁项目集。因此首先要做的是找出1−频繁项目集1-频繁项目集1−频繁项目集,这个很容易得到,只要循环扫描一次事务集合统计出项目集合中每个元素的支持度,然后根据设定的支持度阈值进行筛选,即可得到1−频繁项目集1-频繁项目集1−频繁项目集。下面证明一下为何可以通过k−频繁项目集k-频繁项目集k−频繁项目集生成(k+1)−(k+1)-(k+1)−频繁项目集:

假设某个项目集S={s1,s2,⋯sn}S=\{s_1,s_2,\cdots s_n\}S={s1​,s2​,⋯sn​}是频繁项目集,那么它的(n−1)(n-1)(n−1)非空子集{s1,s2,⋯sn−1}\{s_1,s_2,\cdots s_{n-1}\}{s1​,s2​,⋯sn−1​},{s1,s2,⋯sn−2,sn}\{s_1,s_2,\cdots s_{n-2},s_n\}{s1​,s2​,⋯sn−2​,sn​} ⋯\cdots⋯ {s2,s3,⋯sn}\{s_2,s_3,\cdots s_n\}{s2​,s3​,⋯sn​}必定都是频繁项目集,通过观察,任何一个含有n个元素的集合A={a1,a2,⋯an}A=\{a_1,a_2,\cdots a_n\}A={a1​,a2​,⋯an​},它的(n−1)(n-1)(n−1)非空子集定会包含两项{a1,a2,⋯an−2,an−1}\{a_1,a_2,\cdots a_{n-2},a_{n-1}\}{a1​,a2​,⋯an−2​,an−1​}和{a1,a2,⋯an−2,an}\{a_1,a_2,\cdots a_{n-2},a_n\}{a1​,a2​,⋯an−2​,an​},对比这两个子集可以发现,它们的前(n−2)(n-2)(n−2)项是相同的,它们的并集就是集合AAA。对于2-频繁项目集,它的所有1非空子集也必定是频繁项目集,那么根据上面的性质,对于2-频繁项目集中的任一个,在1-频繁项目集中必定存在2个集合(不需要一定是最后一个元素不同)的并集与它相同。因此在所有的1-频繁项目集中找出只有一项不同的集合,将其合并,即可得到所有的包含2个元素的项目集,得到的这些包含2个元素的项目集不一定都是频繁项目集,所以需要进行剪枝。剪枝的办法是看它的所有1非空子集是否在1-频繁项目集中,如果存在1非空子集不在1-频繁项目集中,则将该2项目集剔除。经过该步骤之后,剩下的则全是频繁项目集,即2-频繁项目集。依次类推,可以生成3-频繁项目集…直至生成所有的频繁项目集。

生成频繁项集

生成一个频繁集的步骤分联合剪枝两步。

  1. 联合(join),伪代码如下:

其中Lk−1L_{k-1}Lk−1​为频繁集。合并只有一个元素不同的itemitemitem,如(1,2,3)、(1,3,7)和(1,4,9),就会是(1,2,3)和(1,3,7)合并成(1,2,3,7),而不会其他的合并,因为其他情况,两元素有不只一个元素不同(为确保合并后的项集元素只增加了一个)。

  1. 剪枝(pruning)
    合并后的集合,如果有子集不在原集合中,则把该合并集合删除。例如:有2-频繁项目集
      {1,2},{1,3},{1,4},{2,3},{2,4}\{1,2\},\{1,3\},\{1,4\},\{2,3\},\{2,4\}{1,2},{1,3},{1,4},{2,3},{2,4}
    因为{1,2},{1,3},{1,4}\{1,2\},\{1,3\},\{1,4\}{1,2},{1,3},{1,4}除了最后一个元素以外都相同,所以求{1,2},{1,3}\{1,2\},\{1,3\}{1,2},{1,3}的并集得到{1,2,3}\{1,2,3\}{1,2,3},{1,2}\{1,2\}{1,2}和{1,4}\{1,4\}{1,4}的并集得到{1,2,4},{1,3}和{1,4}\{1,2,4\},\{1,3\}和\{1,4\}{1,2,4},{1,3}和{1,4}的并集得到{1,3,4}\{1,3,4\}{1,3,4}。但是由于{1,3,4}\{1,3,4\}{1,3,4}的子集{3,4}\{3,4\}{3,4}不在2-频繁项目集中,所以需要把{1,3,4}\{1,3,4\}{1,3,4}剔除掉。

生成强规则

  得到频繁项目集之后,则需要从频繁项目集中找出符合条件的强关联规则。最简单的办法是:遍历所有的频繁项目集,然后从每个项目集中依次取1、2、⋯k1、2、\cdots k1、2、⋯k个元素作为后件,该项目集中的其他元素作为前件,计算该规则的置信度进行筛选即可。这样的穷举效率显然很低。假如对于一个频繁项目集fff,可以生成下面这样的关联规则:
(f−β)→β(f-\beta)\to \beta(f−β)→β

那么这条规则的置信度confidence=f.count/(f−β).countconfidence=f.count/(f-β).countconfidence=f.count/(f−β).count
  根据这个置信度计算公式可知,对于一个频繁项目集f.countf.countf.count是不变的,而假设该规则是强关联规则,则(f−βsub)→βsub(f-\beta_{sub})\to \beta_{sub}(f−βsub​)→βsub​也是强关联规则,其中βsub\beta_{sub}βsub​是β\betaβ的子集,因为(f−βsub).count(f-\beta_{sub}).count(f−βsub​).count肯定小于(f−β).count(f-\beta).count(f−β).count。即给定一个频繁项目集fff,如果一条强关联规则的后件为βββ,那么以βββ的非空子集为后件的关联规则都是强关联规则。所以可以先生成所有的1-后件(后件只有一项)强关联规则,然后再生成2-后件强关联规则,依次类推(与生成频繁项集类似),直至生成所有的强关联规则

一个例子

下面举例说明Apiori算法的具体流程:
假如有项目集合I={1,2,3,4,5}I=\{1,2,3,4,5\}I={1,2,3,4,5},有事务集TTT:

t1:1,2,3
t2:1,2,4
t3:1,3,4
t4:1,2,3,5
t5:1,3,5
t6:2,4,5
t7:1,2,3,4

设定minsup=3/7,minconf=5/7。

首先:生成频繁项目集:

1-频繁项目集:{1},{2},{3},{4},{5}\{1\},\{2\},\{3\},\{4\},\{5\}{1},{2},{3},{4},{5}

  生成2-频繁项目集:
  根据1-频繁项目集生成所有的包含2个元素的项目集:任意取两个只有最后一个元素不同的1-频繁项目集,求其并集,由于每个1-频繁项目集元素只有一个,所以生成的项目集如下:

{1,2},{1,3},{1,4},{1,5}\{1,2\},\{1,3\},\{1,4\},\{1,5\}{1,2},{1,3},{1,4},{1,5}
{2,3},{2,4},{2,5}\{2,3\},\{2,4\},\{2,5\}{2,3},{2,4},{2,5}
{3,4},{3,5}\{3,4\},\{3,5\}{3,4},{3,5}
{4,5}\{4,5\}{4,5}

  计算它们的支持度,发现只有{1,2},{1,3},{1,4},{2,3},{2,4},{2,5}\{1,2\},\{1,3\},\{1,4\},\{2,3\},\{2,4\},\{2,5\}{1,2},{1,3},{1,4},{2,3},{2,4},{2,5}的支持度满足要求,因此求得2-频繁项目集:

{1,2},{1,3},{1,4},{2,3},{2,4}\{1,2\},\{1,3\},\{1,4\},\{2,3\},\{2,4\}{1,2},{1,3},{1,4},{2,3},{2,4}

  生成3-频繁项目集:

  因为{1,2},{1,3},{1,4}\{1,2\},\{1,3\},\{1,4\}{1,2},{1,3},{1,4}除了最后一个元素以外都相同,所以求{1,2},{1,3}\{1,2\},\{1,3\}{1,2},{1,3}的并集得到{1,2,3}\{1,2,3\}{1,2,3},{1,2},{1,4}\{1,2\},\{1,4\}{1,2},{1,4}的并集得到{1,2,4}\{1,2,4\}{1,2,4},{1,3},{1,4}\{1,3\},\{1,4\}{1,3},{1,4}的并集得到{1,3,4}\{1,3,4\}{1,3,4}。但是由于{1,3,4}\{1,3,4\}{1,3,4}的子集{3,4}\{3,4\}{3,4}不在2-频繁项目集中,所以需要把{1,3,4}\{1,3,4\}{1,3,4}剔除掉。然后再来计算{1,2,3}\{1,2,3\}{1,2,3}和{1,2,4}\{1,2,4\}{1,2,4}的支持度,发现{1,2,3}\{1,2,3\}{1,2,3}的支持度为3/7,{1,2,4}\{1,2,4\}{1,2,4}的支持度为2/7,所以需要把{1,2,4}\{1,2,4\}{1,2,4}剔除。同理可以对{2,3}\{2,3\}{2,3},{2,4}\{2,4\}{2,4}求并集得到{2,3,4}\{2,3,4\}{2,3,4},但是{2,3,4}\{2,3,4\}{2,3,4}的支持度不满足要求,所以需要剔除掉。

  因此得到3-频繁项目集:{1,2,3}\{1,2,3\}{1,2,3}。

  到此频繁项目集生成过程结束。注意生成频繁项目集的时候,频繁项目集中的元素个数最大值为事务集中事务中含有的最大元素个数,即若事务集中事务包含的最大元素个数为k,那么最多能生成k-频繁项目集,这个原因很简单,因为事务集合中的所有事务都不包含(k+1)个元素,所以不可能存在(k+1)—频繁项目集。在生成过程中,若得到的频繁项目集个数小于2,生成过程也可以结束了。
  
  现在需要生成强关联规则:

  这里只说明3-频繁项目集生成关联规则的过程:

  对于集合{1,2,3}\{1,2,3\}{1,2,3}

  先生成1-后件的关联规则:

(1,2)→3(1,2)\to 3(1,2)→3,置信度=3/4

(1,3)→2(1,3)\to 2(1,3)→2,置信度=3/5

(2,3)→1(2,3)\to 1(2,3)→1,置信度=3/3

(1,3)→2(1,3)\to 2(1,3)→2 的置信度不满足要求,所以剔除掉。因此得到1后件的集合{1}\{1\}{1},{3}\{3\}{3},然后再以{1,3}\{1,3\}{1,3}作为后件。
  
   2→(1,3)2\to (1,3)2→(1,3) 的置信度=3/5不满足要求,所以对于3-频繁项目集生成的强关联规则为:(1,2)→3(1,2)\to 3(1,2)→3和(2,3)→1(2,3)\to 1(2,3)→1。

Apriori算法的优缺点

  • 优点
    Apriori算法采用了逐层搜索的迭代的方法,算法简单明了,没有复杂的理论推导,也易于实现。
  • 缺点
  1. 对数据库的扫描次数过多,导致数据量大时速度很慢。
  2. Apriori算法会产生大量的中间项集(候选集)。
  3. 采用唯一支持度。
  4. 算法的适应面窄。
  • 改进方式有三个角度:
  1. 减少扫描数据库的次数(Partition算法、FP-growth算法)
  2. 减少候选集(Aprior已经减少了一部分candidates,但还有没有更快的方法)
  3. 怎样数这个candiates出现次数数的更快

参考文章:http://www.cnblogs.com/dolphin0520/archive/2012/10/29/2733356.html

【机器学习】数据挖掘算法——关联规则(二),挖掘过程,Aprioir算法相关推荐

  1. 《MATLAB智能算法30个案例》:第23章 基于蚁群算法的二维路径规划算法

    <MATLAB智能算法30个案例>:第23章 基于蚁群算法的二维路径规划算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  2. 《机器学习》及实战二、K-近邻算法(KNN)理论及实战

    Python版本: Python3.x 运行平台: Windows IDE: PyCharm 参考资料:<机器学习>(西瓜书)<机器学习实战>(王斌) 转载请标明出处 数据下载 ...

  3. python图像分割算法_Opencv(二)—图像分割之分水岭算法!

    做图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图 ...

  4. 【数据挖掘】关联规则基本概念及Apropri算法

    本文主要参考中国大学mooc的数据挖掘和钟雪灵<Python金融数据挖掘> 一.基本概念 事务与项集 事务(transaction):关联规则分析的对象,可理解为一种商业行为:事务由序号和 ...

  5. 机器学习--支持向量机实战(二)简易SMO算法实现

    该简易算法其实完成的任务很简单,就是违反KKT条件的alpha进行符合KKT条件,然后通过不在边界的点进行迭代,然后使其alpha稳定下来下面的代码基本每一句都进行了详细的解释,具体看代码,但是建议没 ...

  6. 轻松解读仿生学最优化算法(二)——蚁群算法

    蚁群算法简单解读 1.仿生学背景 蚂蚁在寻找食物的过程中,会在经过的道路上留下信息素. 起初蚂蚁不知道食物在哪儿,于是在经过的道路上留下浓度一致的信息素.在同样的时间内,绕远路的蚂蚁和走近路的蚂蚁消耗 ...

  7. 捷联惯导算法(二)位置更新算法的理解

    前言 文中算法公式摘自<捷联惯导算法与组合导航原理>(严恭敏.翁浚 编著).<惯性导航>(秦永元 编著),其他理解仅代表个人观点.本文是对位置更新算法,按照自己学习的思路整理得 ...

  8. 2018/8/22部分算法总结 二维几何常用算法

    1.判断点在多边形内 对于简单多边形(边不自交)有两种方法可以判断, 第一种是看该点与多边形每条边构成的三角形面积和是否等于多边形的总面积.转角法 第二种是刘汝佳<<训练指南>> ...

  9. Apriori算法简介---关联规则的频繁项集算法

    由啤酒和尿布引出: 在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的商品居然摆在一起.但这一奇怪的举措居然使尿布和啤酒的稍量大幅增加了.这可不是一个笑话,而是一直被商家所津津 ...

  10. 关联规则(一)Apriori算法

    此篇文章转自 http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html 个人觉得比课本上讲的更通俗易懂! 1.  挖掘关联规则 1.1   什么是关联规 ...

最新文章

  1. threshold 二值化的实现
  2. Redis中列表list数据类型(增加(在左侧、右侧或指定元素前后插入数据)、获取(获取表内指定范围的元素)、更新(获取指定索引位置的元素值)、删除(删除指定元素、count))
  3. Scala基础:定义变量和逻辑判断语句以及方法和函数
  4. 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
  5. Java 8中java.util.function包中的谓词和使用者接口
  6. 图像特征提取与描述_角点特征04:LBP算法+HOG特征算子
  7. win10搜索框没反应怎么修复
  8. 春天到了,减肥机器人也到了。
  9. 机器学习实战系列(六):Adaboost提升法
  10. 20. yii 2 分页
  11. ThreadPoolExecutor 线程池理论、饱和策略、工作队列排队策略
  12. Jmeter脚本录制 badboy的下载安装教程
  13. 固态硬盘分为哪几种_固态硬盘分类简介和选择
  14. CCF推荐会议(人工智能与模式识别)
  15. 空间轨迹分析与应用(前言)Computing with Spatial Trajectories
  16. 二重积分x^2+y^2_计算二重积分∫∫(x+y)dxdy,其中D为x^2+y^2≤2x
  17. uni-app开发APP上架Apple Store流程记录
  18. 2016,轻轻地你走了,正如你轻轻地来,2017新年快乐
  19. 3.Ubuntu 安装Pinta图片处理工具
  20. quartz不正常执行.执行一段时间后无故停止

热门文章

  1. 实验-网页动画(js版)
  2. JDK8 SE安装步骤
  3. timesten支持mysql吗_Timesten常用命令
  4. JS原生 实现图片懒加载
  5. 文件转换shape格式_万能格式转换器!支持200+种文件格式的云转换!
  6. 使用vue制作富文本框
  7. 对JavaScript内置对象arguments的一些见解
  8. 安卓JNI使用C++类
  9. 从零开始netty学习笔记之BIO
  10. tpshop防止sql注入补丁