转自:http://www.cnblogs.com/fengfenggirl/p/associate_apriori.html

数据挖掘系列 (1) 关联规则挖掘基本概念与 Aprior 算法

我计划整理数据挖掘的基本概念和算法,包括关联规则挖掘、分类、聚类的常用算法,敬请期待。今天讲的是关联规则挖掘的最基本的知识。

关联规则挖掘在电商、零售、大气物理、生物医学已经有了广泛的应用,本篇文章将介绍一些基本知识和 Aprori 算法。

啤酒与尿布的故事已经成为了关联规则挖掘的经典案例,还有人专门出了一本书《啤酒与尿布》,虽然说这个故事是哈弗商学院杜撰出来的,但确实能很好的解释关联规则挖掘的原理。我们这里以一个超市购物篮迷你数据集来解释关联规则挖掘的基本概念:

TID Items
T1 {牛奶,面包}
T2 {面包,尿布,啤酒,鸡蛋}
T3 {牛奶,尿布,啤酒,可乐}
T4 {面包,牛奶,尿布,啤酒}
T5 {面包,牛奶,尿布,可乐}

  表中的每一行代表一次购买清单(注意你购买十盒牛奶也只计一次,即只记录某个商品的出现与否)。数据记录的所有项的集合称为总项集,上表中的总项集 S = {牛奶,面包,尿布,啤酒,鸡蛋,可乐}。

 一、关联规则、自信度、自持度的定义

  关联规则就是有关联的规则,形式是这样定义的:两个不相交的非空集合 X、Y,如果有 X-->Y,就说 X-->Y 是一条关联规则。举个例子,在上面的表中,我们发现购买啤酒就一定会购买尿布,{啤酒}-->{尿布} 就是一条关联规则。关联规则的强度用支持度(support)和自信度(confidence)来描述,

  支持度的定义:support(X-->Y) = |X 交 Y| / N=集合 X 与集合 Y 中的项在一条记录中同时出现的次数/数据记录的个数。例如:support({啤酒}-->{尿布}) = 啤酒和尿布同时出现的次数/数据记录数 = 3 / 5 = 60%。

  自信度的定义:confidence(X-->Y) = |X 交 Y| / |X| = 集合 X 与集合 Y 中的项在一条记录中同时出现的次数/集合 X 出现的个数 。例如:confidence({啤酒}-->{尿布}) = 啤酒和尿布同时出现的次数 / 啤酒出现的次数 = 3 / 3 = 100%; confidence({尿布}-->{啤酒}) = 啤酒和尿布同时出现的次数 / 尿布出现的次数 = 3 / 4 = 75%。

  这里定义的支持度和自信度都是相对的支持度和自信度,不是绝对支持度,绝对支持度abs_support = 数据记录数 N * support。

  支持度和自信度越高,说明规则越强,关联规则挖掘就是挖掘出满足一定强度的规则。

二、关联规则挖掘的定义与步骤

  关联规则挖掘的定义:给定一个交易数据集 T,找出其中所有支持度 support >= min_support、自信度 confidence >= min_confidence的关联规则。

  有一个简单而粗鲁的方法可以找出所需要的规则,那就是穷举项集的所有组合,并测试每个组合是否满足条件,一个元素个数为 n 的项集的组合个数为 2^n-1(除去空集),所需要的时间复杂度明显为 O(2^N),对于普通的超市,其商品的项集数也在 1 万以上,用指数时间复杂度的算法不能在可接受的时间内解决问题。怎样快速挖出满足条件的关联规则是关联挖掘的需要解决的主要问题。

  仔细想一下,我们会发现对于 {啤酒-->尿布},{尿布-->啤酒} 这两个规则的支持度实际上只需要计算 {尿布,啤酒} 的支持度,即它们交集的支持度。于是我们把关联规则挖掘分两步进行:

  1)生成频繁项集

  这一阶段找出所有满足最小支持度的项集,找出的这些项集称为频繁项集。

  2)生成规则

  在上一步产生的频繁项集的基础上生成满足最小自信度的规则,产生的规则称为强规则。

  关联规则挖掘所花费的时间主要是在生成频繁项集上,因为找出的频繁项集往往不会很多,利用频繁项集生成规则也就不会花太多的时间,而生成频繁项集需要测试很多的备选项集,如果不加优化,所需的时间是 O(2^N)。

三、Apriori 定律

  为了减少频繁项集的生成时间,我们应该尽早的消除一些完全不可能是频繁项集的集合,Apriori 的两条定律就是干这事的。

  Apriori 定律 1):如果一个集合是频繁项集,则它的所有子集都是频繁项集。举例:假设一个集合 {A,B} 是频繁项集,即 A、B 同时出现在一条记录的次数大于等于最小支持度min_support,则它的子集 {A},{B} 出现次数必定大于等于 min_support,即它的子集都是频繁项集。

  Apriori 定律 2):如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。举例:假设集合 {A} 不是频繁项集,即 A 出现的次数小于 min_support,则它的任何超集如{A,B} 出现的次数必定小于 min_support,因此其超集必定也不是频繁项集。

  利用这两条定律,我们抛掉很多的候选项集,Apriori 算法就是利用这两个定理来实现快速挖掘频繁项集的。

四、Apriori 算法

  Apriori 是由 a priori 合并而来的,它的意思是后面的是在前面的基础上推出来的,即先验推导,怎么个先验法,其实就是二级频繁项集是在一级频繁项集的基础上产生的,三级频繁项集是在二级频繁项集的基础上产生的,以此类推。

  Apriori 算法属于候选消除算法,是一个生成候选集、消除不满足条件的候选集、并不断循环直到不再产生候选集的过程。

  

  上面的图演示了 Apriori 算法的过程,注意看由二级频繁项集生成三级候选项集时,没有 {牛奶,面包,啤酒},那是因为 {面包,啤酒} 不是二级频繁项集,这里利用了 Apriori 定理。最后生成三级频繁项集后,没有更高一级的候选项集,因此整个算法结束,{牛奶,面包,尿布} 是最大频繁子集。

  算法的思想知道了,这里也就不上伪代码了,我认为理解了算法的思想后,子集去构思实现才能理解更深刻,这里贴一下我的关键代码:

 1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 record = getRecord();// 获取原始数据记录
4 List<List<String>> cItemset = findFirstCandidate();// 获取第一次的备选集
5 List<List<String>> lItemset = getSupportedItemset(cItemset);// 获取备选集 cItemset 满足支持的集合
6
7 while (endTag != true) {// 只要能继续挖掘
8 List<List<String>> ckItemset = getNextCandidate(lItemset);// 获取第下一次的备选集
9 List<List<String>> lkItemset = getSupportedItemset(ckItemset);// 获取备选集 cItemset 满足支持的集合
10 getConfidencedItemset(lkItemset, lItemset, dkCountMap, dCountMap);// 获取备选集 cItemset 满足置信度的集合
11 if (confItemset.size() != 0)// 满足置信度的集合不为空
12 printConfItemset(confItemset);// 打印满足置信度的集合
13 confItemset.clear();// 清空置信度的集合
14 cItemset = ckItemset;// 保存数据,为下次循环迭代准备
15 lItemset = lkItemset;
16 dCountMap.clear();
17 dCountMap.putAll(dkCountMap);
18 }

  如果想看完整的代码,可以查看我的 github,数据集的格式跟本文所述的略有不通,但不影响对算法的理解。

  下一篇将介绍效率更高的算法 -- FP-Grow 算法。

参考文献:

  [1]. Pang-Ning Tan,Michael Steinbach. Introduction to Data Mining.

  [2]. HanJiaWei. Data Mining: concept and  techniques.

  感谢关注,欢迎回帖交流。

  转载请注明出处:www.cnblogs.com/fengfenggirl

数据挖掘系列 (1) 关联规则挖掘基本概念与 Aprior 算法的更多相关文章

  1. 数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法

    整理数据挖掘的基本概念和算法,包括关联规则挖掘.分类.聚类的常用算法,敬请期待.今天讲的是关联规则挖掘的最基本的知识. 关联规则挖掘在电商.零售.大气物理.生物医学已经有了广泛的应用,本篇文章将介绍一 ...

  2. 数据挖掘进阶之关联规则挖掘FP-Growth算法

    数据挖掘进阶之关联规则挖掘FP-Growth算法 绪 近期在写论文方面涉及到了数据挖掘,需要通过数据挖掘方法实现软件与用户间交互模式的获取.分析与分类研究.主要涉及到关联规则与序列模式挖掘两块.关联规 ...

  3. 数据挖掘算法之关联规则挖掘(一)apriori算法

    关联规则挖掘算法在生活中的应用处处可见,几乎在各个电子商务网站上都可以看到其应用 举个简单的例子 如当当网,在你浏览一本书的时候,可以在页面中看到一些套餐推荐,本书+有关系的书1+有关系的书2+... ...

  4. [数据挖掘课程笔记]关联规则挖掘 - Apriori算法

    两种度量: 支持度(support)  support(A→B) = count(AUB)/N (N是数据库中记录的条数) 自信度(confidence)confidence(A→B) = count ...

  5. 数据挖掘算法之关联规则挖掘(二)FPGrowth算法

    之前介绍的apriori算法中因为存在许多的缺陷,例如进行大量的全表扫描和计算量巨大的自然连接,所以现在几乎已经不再使用 在mahout的算法库中使用的是PFP算法,该算法是FPGrowth算法的分布 ...

  6. FP-Tree -关联规则挖掘算法(转载)

    在关联规则挖掘领域最经典的算法法是Apriori,其致命的缺点是需要多次扫描事务数据库.于是人们提出了各种裁剪(prune)数据集的方法以减少I/O开支 支持度和置信度 严格地说Apriori和FP- ...

  7. 数据挖掘系列(4)使用weka做关联规则挖掘

    前面几篇介绍了关联规则的一些基本概念和两个基本算法,但实际在商业应用中,写算法反而比较少,理解数据,把握数据,利用工具才是重要的,前面的基础篇是对算法的理解,这篇将介绍开源利用数据挖掘工具weka进行 ...

  8. 数据挖掘系列(5)使用mahout做海量数据关联规则挖掘

    上一篇介绍了用开源数据挖掘软件weka做关联规则挖掘,weka方便实用,但不能处理大数据集,因为内存放不下,给它再多的时间也是无用,因此需要进行分布式计算,mahout是一个基于hadoop的分布式数 ...

  9. 数据挖掘算法之-关联规则挖掘(Association Rule)

    在数据挖掘的知识模式中,关联规则模式是比较重要的一种.关联规则的概念由Agrawal.Imielinski.Swami 提出,是数据中一种简单但很实用的规则.关联规则模式属于描述型模式,发现关联规则的 ...

随机推荐

  1. STM32的独立看门狗

    STM32 内 部自带了 2 个看门狗:独立看门狗(IWDG)和窗体看门狗(WWDG) STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动.即使主时钟发生问题.它也仍然 有效. 这里须要注 ...

  2. Hadop使用Partitioner后,结果还是一个文件,怎样解决??

    近期看了一下partitioner.于是照着写了一个列子.最后发现程序并没有将结果分开写入对应的文件,结果还是一个文件,于是乎感觉是不是没实用集群去执行程序,发现control中还是本地执行的代码: ...

  3. 逻辑回归 C++

    #include <iostream>#include <string>#include <fstream>#include <sstream>#inc ...

  4. 用xftp从win7系统传输一些必要的文件到Linux

    新建会话,主机名为Linux系统的ip地址,选用SFTP协议,选用UTF-8编码格式 1.安装JDK 切换到java路径下 卸载openJDK: 用rpm -qa |grep java指令查看 用rp ...

  5. 虚拟机下不能运行gazebo

    bug描述: VMware: vmw_ioctl_command error Invalid argument. 解决方式:设置环境变量 export SVGA_VGPU10=0 或者 echo &q ...

  6. Java面试概念之String、StringBuffer与StringBuilder的区别

    参考博客 http://www.cnblogs.com/lchzls/p/6711375.html java中String.StringBuffer.StringBuilder是Java编程中经常使用 ...

  7. 《CSS Mastery》读书笔记(4)

    第七章 布局   CSS得到一个不好的名声,比较难懂, 一方面由于浏览器的不兼容,另一方面由于网上大量的技巧,每个CSS作者都可以有自己的方法去创建多列布局, 新的CSS开发者只是使用一种方法而不去理 ...

  8. cannot connect to host的解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 下午更新源码,出现下面的错误: 通过ping来测试svn服务器的连接,发现可以连接得通,于是猜测可以服务器的svn服务 ...

  9. 华为 荣耀 等手机解锁BootLoader

    下载工具按提示操作即可 链接:https://pan.baidu.com/s/1qZezd1q 密码:8pad 备用链接:https://pan.baidu.com/s/1nwv0heD

  10. c++ 虚函数,纯虚函数的本质区别

    转载博客:https://mp.weixin.qq.com/s?__biz=MzAxNzYzMTU0Ng==&mid=2651289202&idx=1&sn=431ffd1fa ...