(一)
Apriori 算法
Apriori算法是种最有影响的挖掘布尔关联规则频繁项集的算法。它的核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集(简称频集),也常称为最大项目集。
在Apriori算法中,寻找最大项目集(频繁项集)的基本思想是:算法需要对数据集进行多步处理。第一步,简单统计所有含一个元素项目集出现的频数,并找出那些不小于最小支持度的项目集,即一维最大项目集。从第二步开始循环处理直到再没有最大项目集生成。循环过程是:第k步中,根据第k-1步生成的(k-1)维最大项目集产生k维侯选项目集,然后对(事务)数据库进行搜索,得到侯选项目集的项集支持度,与最小支持度进行比较,从而找到k维最大项目集。
下面以图例的方式说明该算法的运行过程: 假设有一个数据库D,其中有4个事务记录,分别表示为:
TID | Items |
---|---|
T1 | I1,I3,I4 |
T2 | I2,I3,I5 |
T3 | I1,I2,I3,I5 |
T4 | I2,I5 |
这里预定最小支持度minSupport=2,下面用图例说明算法运行的过程:
TID | Items |
---|---|
T1 | I1,I3,I4 |
T2 | I2,I3,I5 |
T3 | I1,I2,I3,I5 |
T4 | I2,I5 |
扫描D,对每个候选项进行支持度计数得到表C1(I1出现2次,I2出现3次,I3出现3次,I4出现1次,I5出现3次):
项集 | 支持度计数 |
---|---|
{I1} | 2 |
{I2} | 3 |
{I3} | 3 |
{I4} | 1 |
{I5} | 3 |
比较候选项支持度计数与最小支持度minSupport,产生1维最大项目集L1(这里,小于支持度为2的被筛选掉):
项集 | 支持度计数 |
---|---|
{I1} | 2 |
{I2} | 3 |
{I3} | 3 |
{I5} | 3 |
由L1产生候选项集C2(I1、I2、I3、I5组合成2维项目集):
项集 |
---|
{I1,I2} |
{I1,I3} |
{I1,I5} |
{I2,I3} |
{I2,I5} |
{I3,I5} |
扫描D,对每个候选项集进行支持度计数:
项集 | 支持度计数 |
---|---|
{I1,I2} | 1 |
{I1,I3} | 2 |
{I1,I5} | 1 |
{I2,I3} | 2 |
{I2,I5} | 3 |
{I3,I5} | 2 |
比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2(找出2维最大项目集,小于2的项目集被筛选掉):
项集 | 支持度计数 |
---|---|
{I1,I3} | 2 |
{I2,I3} | 2 |
{I2,I5} | 3 |
{I3,I5} | 2 |
由L2产生候选项集C3(扫描数据库一次生成3-频繁集,并把它们排序,放入L表中):
项集 |
---|
{I2,I3,I5} |
比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:
项集 | 支持度计数 |
---|---|
{I2,I3,I5} | 2 |
算法终止。
从算法的运行过程,我们可以看出该Apriori算法的优点:简单、易理解、数据要求低,然而我们也可以看到Apriori算法的缺点:(1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法,如下面要介绍的F-P算法。
问题思路:从K-1维最大项目集中选出K维候选项目集的依据是什么、最小支持度怎么设定才合理、
部分转自维基百科:http://zh.wikipedia.org/wiki/%E5%85%B3%E8%81%94%E5%BC%8F%E8%A7%84%E5%88%99#Apriori_.E6.BC.94.E7.AE.97.E6.B3.95
(二)
关联规则的三种算法:
1.Apriori算法:使用候选项集找频繁项集
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。
该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。
基于以上描述,Apriori算法应该是对离散型数据进行分析的工具。
2.基于划分的算法
Savasere等设计了一个基于划分的算法。这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频集至少在某一个分块中是频集保证的。该算法是可以高度并行的,可以把每一分块分别分配给某一个处理器生成频集。产生频集的每一个循环结束后,处理器之间进行通信来产生全局的候选k-项集。
从这点看来,该算法要求的数据也是离散数据。
3.FP-树频集算法
针对Apriori算法的固有缺陷,J. Han等提出了不产生候选挖掘频繁项集的方法:FP-树频集算法。采用分而治之的策略,在经过第一遍扫描之后,把数据库中的频集压缩进一棵频繁模式树(FP-tree),同时依然保留其中的关联信息,随后再将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关,然后再对这些条件库分别进行挖掘。当原始数据量很大的时候,也可以结合划分的方法,使得一个FP-tree可以放入主存中。实验表明,FP-growth对不同长度的规则都有很好的适应性,同时在效率上较之Apriori算法有巨大的提高。
FP-树对数据值的强制要求,是二项值。比如true和false。
(
FP-Tree算法 基本原理和思想:
只进行2次数据库扫描,不使用候选集,直接压缩数据库成一个频繁模式树,最后通过这棵树生成挂链规则。基本过程如下:
(1) 按Apriori算法,扫描数据库一次生成1-频繁集,并把它们按照降序排序,放入L表中。
(2) 创建根节点,并标志为null,扫描数据库一次,当得到数据库的一个项目集时,就把其中的元素按L表的次序排序,然后递归调用FP-growth来实现FP-tree增长。
)转自:http://f.dataguru.cn/thread-293331-1-1.html
(三)
再来一个栗子:
(四)
一、Apriori算法简介: Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。 Apriori(先验的,推测的)算法应用广泛,可用于消费市场价格分析,猜测顾客的消费习惯;网络安全领域中的入侵检测技术;可用在用于高校管理中,根据挖掘规则可以有效地辅助学校管理部门有针对性的开展贫困助学工作;也可用在移动通信领域中,指导运营商的业务运营和辅助业务提供商的决策制定。
二、挖掘步骤:
1.依据支持度找出所有频繁项集(频度)
2.依据置信度产生关联规则(强度)
三、基本概念
对于A->B
①支持度:P(A ∩ B),既有A又有B的概率
②置信度:
P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ⇒ 面包
例子:[支持度:3%,置信度:40%]
支持度3%:意味着3%顾客同时购买牛奶和面包
置信度40%:意味着购买牛奶的顾客40%也购买面包
③如果事件A中包含k个元素,那么称这个事件A为k项集事件A满足最小支持度阈值的事件称为频繁k项集。
④同时满足最小支持度阈值和最小置信度阈值的规则称为强规则
四、实现步骤
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法Apriori使用一种称作逐层搜索的迭代方法,“K-1项集”用于搜索“K项集”。
首先,找出频繁“1项集”的集合,该集合记作L1。L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描。
核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。
简单的讲,1、发现频繁项集,过程为(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集 重复步骤(1)~(5)直到不能发现更大的频集
2、产生关联规则,过程为:根据前面提到的置信度的定义,关联规则的产生如下:
(1)对于每个频繁项集L,产生L的所有非空子集;
(2)对于L的每个非空子集S,如果
P(L)/P(S)≧min_conf
则输出规则“SàL-S”
注:L-S表示在项集L中除去S子集的项集
再来一张图解释一下:
五、总结:
①Apriori算法的缺点:(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。(2)在验证候选频繁k项集的时候需要对整个(事务)数据库进行扫描,非常耗时。
②网上提到的频集算法的几种优化方法:1. 基于划分的方法。2. 基于hash的方法。3. 基于采样的方法。4. 减少交易的个数。
(五)
定理2:非频繁项集的超集一定是非频繁项集。
http://www.tuicool.com/articles/U7VzUv2
http://f.dataguru.cn/thread-257918-1-1.html
(六)
关联规则挖掘(Association rule mining)是数据挖掘中最活跃的研究方法之一,可以用来发现事情之间的联系,最早是为了发现超市交易数据库中不同的商品之间的关系。(啤酒与尿布)
基本概念
- 支持度的定义: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%
同时满足最小支持度阈值(min_sup)和最小置信度阈值(min_conf)的规则称作强规则 ,如果项集满足最小支持度,则称它为频繁项集
“如何由大型数据库挖掘关联规则?”关联规则的挖掘是一个两步的过程:
- 找出所有频繁项集:根据定义,这些项集出现的频繁性至少和预定义的最小支持计数一样。
- 由频繁项集产生强关联规则:根据定义,这些规则必须满足最小支持度和最小置信度。
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定理。最后生成三级频繁项集后,没有更高一级的候选项集,因此整个算法结束,{牛奶,面包,尿布}是最大频繁子集。
Python实现算法地址https://github.com/taizilongxu/datamining
参考资料
- http://www.cnblogs.com/fengfenggirl/p/associate_apriori.html
- http://blog.csdn.net/lizhengnanhua/article/details/9061887