频繁项挖掘-Apriori算法

关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集或者关联规则。频繁项集是经常出现在一块的物品的集合,关联规则暗示两种物品之间可能存在很强的关系。

频繁项集挖掘算法用于挖掘经常一起出现的item集合(称为频繁项集),通过挖掘出这些频繁项集,当在一个事务中出现频繁项集的其中一个item,则可以把该频繁项集的其他item作为推荐。比如经典的购物篮分析中啤酒、尿布故事,啤酒和尿布经常在用户的购物篮中一起出现,通过挖掘出啤酒、尿布这个啤酒项集,则当一个用户买了啤酒的时候可以为他推荐尿布,这样用户购买的可能性会比较大,从而达到组合营销的目的。
常见的频繁项集挖掘算法有两类,一类是Apriori算法,另一类是FPGrowth。

本文主要阐述一下用Apriori算法进行频繁项挖掘。

首先来看一个概念——支持度。一个项集的支持度被定义为数据集中包含该项集的记录所占的比例。例如,数据集{(豆奶,莴苣),(莴苣,尿布,葡萄酒,甜菜),(豆奶,尿布,葡萄酒,橙汁),(莴苣,豆奶,尿布,葡萄酒),(莴苣,豆奶,尿布,橙汁)}中(豆奶)的支持度为4/5.(豆奶,尿布)的支持度为3/5.支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小支持度的项集。

Apriori原理

假设我们在经营一家商品种类并不多的杂货店,我们对那些经常在一起被购买的商品非常感兴趣。我们有4中商品:0,1,2,3.那么所有可能被一起购买的商品组合都有哪些?这些商品组合可能只有一种商品,比如商品0,也可能包括两种、三种或四种。我们并不关心某人买了两件商品0的情况,我们只关心他购买了那种商品组合。

下图显示了物品之间所有可能的组合:


前面说过,我们的目标是找到经常在一起购买的物品集合。对于集合(0,3),我们遍历每条记录并检查是否包含记录0和3,如果同时包含这两项,则计数加1,在扫描完所有数据之后,使用统计得到的总数处于总的交易记录数,则得到集合(0,3)的支持度。要计算得到所有物品组合的支持度,就需要走一遍上述步骤,4种商品需要15次,对于包含N种商品的数据集,则需要遍历2^N-1次。如果N很大,那么这个复杂度是指数级别。十分耗时!

为了降低所需的计算时间,研究人员发现了一种所谓Apriori原理。Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。对于上图中的例子,如果(0,1)是频繁的,那么(0)和(1)也是频繁的。这个原理直观上并没有什么帮助,但是反过来看就有用了,也就是说如果一个项集是非频繁项集,那么它的所有超集也是非频繁的。

如下图所示:


已知项集(2,3)是非频繁的,那么利用Apriori原理,我们就可以知道项集(0,2,3)(1,2,3)(0,1,2,3)都是非频繁的。那么就不需要再计算这几项的支持度了,因为我们知道它们不满足要求。使用该原理可以避免项集数目的指数增长,从而在合理时间内计算出频繁项集。


使用Apriori算法来发现频繁项集

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

具体的实现代码就不放了,因为不同的任务数据结构不同。不过,需要注意的是:该算法麻烦的一点是在生成第k层(包含k个元素)候选项集时,需要判断生成的项集是否是上一层非频繁项集合中某一个非频繁项集的超集,如果是,则去掉,否则则加入候选项集中。这一点在写代码实现时需要仔细考虑一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值