使用Apriori算法和FP-growth算法进行关联分析

系列文章:《机器学习》学习笔记

最近看了《机器学习实战》中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集)。正如章节标题所示,这两章讲了无监督机器学习方法中的关联分析问题。关联分析可以用于回答"哪些商品经常被同时购买?"之类的问题。书中举了一些关联分析的例子:

  • 通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为。这种从数据海洋中抽取的知识可以用于商品定价、市场促销、存活管理等环节。
  • 在美国国会投票记录中发现关联规则。在一个国会投票记录的数据集中发现议案投票的相关性,(原文:这里只是出于娱乐的目的,不过也可以……)使用分析结果来为政治竞选活动服务,或者预测选举官员会如何投票。
  • 发现毒蘑菇的相似特征。这里只对包含某个特定元素(有毒性)的项集感兴趣,从中寻找毒蘑菇中的一些公共特征,利用这些特征来避免吃到那些有毒蘑菇。
  • 在Twitter源中发现一些共现词。对于给定搜索词,发现推文中频繁出现的单词集合。
  • 从新闻网站点击流中挖掘新闻流行趋势,挖掘哪些新闻广泛被用户浏览到。
  • 搜索引擎推荐,在用户输入查询词时推荐同相关的查询词项。

从大规模数据集中寻找物品间的隐含关系被称作关联分析(association analysis)或者关联规则学习(association rule learning)。这里的主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索方法并不能解决这个问题,所以需要用更智能的方法在合理的时间范围内找到频繁项集。本文分别介绍如何使用Apriori算法和FP-growth算法来解决上述问题。

1. 关联分析

关联分析是在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:

  • 频繁项集
  • 关联规则

频繁项集(frequent item sets)是经常出现在一块儿的物品的集合,关联规则(association rules)暗示两种物品之间可能存在很强的关系。

下面用一个例子来说明这两种概念:图1给出了某个杂货店的交易清单。


交易号码


商品


0


豆奶,莴苣


1


莴苣,尿布,葡萄酒,甜菜


2


豆奶,尿布,葡萄酒,橙汁


3


莴苣,豆奶,尿布,葡萄酒


4


莴苣,豆奶,尿布,橙汁

图1 某个杂货店的交易清单

频繁项集是指那些经常出现在一起的商品集合,图中的集合{葡萄酒,尿布,豆奶}就是频繁项集的一个例子。从这个数据集中也可以找到诸如尿布->葡萄酒的关联规则,即如果有人买了尿布,那么他很可能也会买葡萄酒。(扩展阅读:尿布与啤酒?)

我们用支持度和可信度来度量这些有趣的关系。一个项集的支持度(support)被定义数据集中包含该项集的记录所占的比例。如上图中,{豆奶}的支持度为4/5,{豆奶,尿布}的支持度为3/5。支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小值尺度的项集。

可信度置信度(confidence)是针对关联规则来定义的。规则{尿布}->{啤酒}的可信度被定义为"支持度({尿布,啤酒})/支持度({尿布})",由于{尿布,啤酒}的支持度为3/5,尿布的支持度为4/5,所以"尿布->啤酒"的可信度为3/4。这意味着对于包含"尿布"的所有记录,我们的规则对其中75%的记录都适用。

2. Apriori原理

假设我们有一家经营着4种商品(商品0,商品1,商品2和商品3)的杂货店,2图显示了所有商品之间所有的可能组合:

图2 集合{0,1,2,3,4}中所有可能的项集组合

对于单个项集的支持度,我们可以通过遍历每条记录并检查该记录是否包含该项集来计算。对于包含N中物品的数据集共有\( 2^N-1 \)种项集组合,重复上述计算过程是不现实的。

研究人员发现一种所谓的Apriori原理,可以帮助我们减少计算量。Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。更常用的是它的逆否命题,即如果一个项集是非频繁的,那么它的所有超集也是非频繁的。

在图3中,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3},{1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的后,就可以紧接着排除{0,2,3}、{1,2,3}和{0,1,2,3}。

图3图中给出了所有可能的项集,其中非频繁项集用灰色表示。

3. 使用Apriori算法来发现频繁集

前面提到,关联分析的目标包括两项:发现频繁项集和发现关联规则。首先需要找到频繁项集,然后才能获得关联规则。

Apriori算法是发现频繁项集的一种方法。Apriori算法的两个输入参数分别是最小支持度和数据集。该算法首先会生成所有单个元素的项集列表。接着扫描数据集来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。

3.1 生成候选项集

数据集扫描的伪代码大致如下:

对数据集中的每条交易记录tran:
????对每个候选项集can:
????????检查can是否是tran的子集
????如果是,则增加can的计数
对每个候选项集:
????如果其支持度不低于最小值,则保留该项集
返回所有频繁项集列表

时间: 2024-12-10 02:30:11

使用Apriori算法和FP-growth算法进行关联分析的相关文章

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

FP—Growth算法

FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录,最小支持度是2%, 用Apriori算法要半个小时但是用FP_growth算法只要6分钟就可以了,效率非常明显. 它的核心是FP_tree,一种树型数据结构,特点是尽量把相同元素用一个节点表示,这样就大大减少了空间,和birch算法有类似的思想.还是以如下数据为例. 每一行表示一条交易,共有9行,既

Frequent Pattern 挖掘之二(FP Growth算法)(转)

FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树).下面就详细谈谈如何构造这个树,举例是最好的方法.请看下面这个例子: 这张表描述了一张商品交易清单,abcdefg代表商品,(ordered)frequent items这一列是把商品按照降序重新进行了排列,这个排序很重要,我们操作的所

Aprior算法、FP Growth算法

数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据集中频繁出现的模式.举个例子,比如在超市的交易系统中,记载了很多次交易,每一次交易的信息包括用户购买的商品清单.如果超市主管是个有心人的话,他会发现尿不湿,啤酒这两样商品在许多用户的购物清单上都出现了,而且频率非常高.尿不湿,啤酒同时出现在一张购物单上就可以称之为一种频繁模式,这样的发掘就可以称之为

机器学习day16 机器学习实战Apriori算法进行关联分析

上一章学习了非监督学习的聚类,聚类算法可以将不同性质的分类分开.这两天学习了apriori算法进行关联分析,感觉是目前最难理解的一章了,并且书中还有个很坑爹的错误,作者存在很大的疏忽. Apriori算法关联分析:从大规模数据集中寻找物品间的隐含关系被称作关联分析或者关联规则学习. 关联分析应用1:我们以前学习的是根据特性进行分类或者回归预测,并没有挖掘特性之间的关系,关联分析可以用于分析数据集中特性之间的关系,可以得到哪些特性频繁的共同出现或者特性之间的关系(比如出现特性A就会很大几率出现特性

数据挖掘-关联分析 Apriori算法和FP-growth 算法

?1.关联分析概念 关联分析是从大量数据中发现项集之间有趣的关联和相关联系. ? ?定义:1.事务:每一条交易称为一个事务,如上图包含5个事务.2.项:交易的每一个物品称为一个项,例如豆奶,啤酒等. 3.项集:包含零个或多个项的集合叫做项集,例如{尿布,啤酒}.4.k?项集:包含k个项的项集叫做k-项集,例如 {豆奶,橙汁}叫做2-项集.5.支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几.例如{尿布, 啤酒}出现在事务002.003和005中,所以           它的支持度计

使用Apriori算法进行关联分析

关联分析是一种在大规模数据集中寻找有趣关系的任务.这些关系可以有两种形式:频繁项集或者关联规则.频繁项集是指经常出现在一块的物品的集合,关联规则暗示两种物品之间可能存在很强的关系.一个项集的支持度被定义为数据集中包含该项集的记录所占的比例.可信度或置信度是针对一条诸如{尿布}->{葡萄酒}的关联规则来定义的.这条规则的可信度被定义为"支持度({尿布->啤酒})/支持度({尿布})" 尽管大部分关联规则分析的实例来自零售业,但该技术同样可以用于其他行业,比如网站流量分析以及医

使用Apriori算法进行关联分析(python2)

summary: 关联分析是用于发现大数据集中元素间有趣关系的一个工具集,可以采用两种方式来量化这些有趣的关系.第一种方式是频繁项集,它会给出经常出现在一起的元素项:第二种方式是关联规则,每条关联规则意味着元素项之间“如果……那么”的关系. 发现元素项间不同的组合是个十分耗时的任务,不可避免需要大量昂贵的计算资源,这就需要更智能的方法在合理时间范围内找到频繁项集. 使用Apriori原理可以减少在数据库上进行检查的集合的数目.Apriori算法从单元素项集开始,通过组合满足最小支持度要求的项集来

Redis源码分析(二十三)--- CRC循环冗余算法和RAND随机数算法

今天开始研究Redis源码中的一些工具类的代码实现,工具类在任何语言中,实现的算法原理应该都是一样的,所以可以借此机会学习一下一些比较经典的算法.比如说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循环冗余校验算法.CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去.在接收端, 则根据信息码和CRC码之间所遵循的规则进