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

摘要:
今天讲的是关联规则挖掘的最基本的知识。关联规则挖掘在电商、零售、大气物理、生物医学已经有了广泛的应用,本篇文章将介绍一些基本知识和Aprori算法。怎样快速挖出满足条件的关联规则是关联挖掘的需要解决的主要问题。

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

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

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

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

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

TIDItems
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 算法属于候选消除算法,是一个生成候选集、消除不满足条件的候选集、并不断循环直到不再产生候选集的过程。

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

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

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

复制代码
1 public static voidmain(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 算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇transformer-encoder用于问答中的意图识别临时表列的长度下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java学习资源整理(超级全面)

这里整理一些自己平常搜集的比较好的关于Java的学习资源,主要包括博客站点、书籍、课程等。 了解Java最新资讯 这部分主要是了解与Java相关的动态以及信息,能够拓展我们的视野以及寻找一些好的idea。每天早晚都可以刷一刷,可以说是每日必逛。下面列出我采取的几种方式。 1.关注twitter上的Java组织以及大牛 许多大牛或公司会在twitter上发布...

粒子群算法(1)----粒子群算法简单介绍

   一、粒子群算法的历史    粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比方研究鸟群系统,每一个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其它的主体进行交流,而且依据交流的过程“学习”或“积累经验”改变自身结构与行为。整个系统的演变或进化包...

音频数字信号详解(2017年11月18日更新)

音频数字信号详解 整理者:赤勇玄心行天道 QQ号:280604597 微信号:qq280604597 QQ群:511046632 博客:www.cnblogs.com/gaoyaguo 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的! 你可以随意转载,无需注明出处! 写文档实属不易,我希望大家能支持我、捐助我,金额...

操作系统--内存管理

内存管理:   1. 单一分区分配:     用于单用户、单任务的操作系统,主存被分为两部分:驻留操作系统(内存低端)、用户进程(内存高端)   2. 多分区分配:     满足多道程序的最简单的存储管理方案,将内存划分成若干个连续区域,称为分区;每个分区只能存储一个程序,并且程序也只能在它所驻留的分区中运行     分区方法分为固定分区和动态分区,分区分...

从零开始学区块链(4)

转自:区块链大师 1. 传统分布式一致性算法和区块链共识过程的异同点 相同点: Append only(只能增加) 强调序列化 少数服从多数原则 分离覆盖的问题:即长链覆盖短链区块,多节点覆盖少数节点日志 不同点: 传统分布式一致性算法大多不考虑拜占庭容错(Byzanetine Paxos除外),即假设所有节点只发生宕机、网络故障等非人为问题,并不考...

Hadoop中TeraSort算法分析

1、概述 1TB排序通常用于衡量分布式数据处理框架的数据处理能力。Terasort是Hadoop中的的一个排序作业,在2008年,Hadoop在1TB排序基准评估中赢得第一名,耗时209秒。那么Terasort在Hadoop中是怎样实现的呢?本文主要从算法设计角度分析Terasort作业。 2、算法思想 实际上,当我们要把传统的串行排序算法设计成并行的排序...