关联分析-Apriori算法

本人最早对数据挖掘的印象是在大三的时候听老师讲过啤酒和尿布的故事:美国一家大型零售商发现,很多男性客户的购买记录中啤酒和尿布常常同时出现。数据背后的原因是很多年轻的爸爸在下班回家后受妻子的嘱托给孩子买尿布,顺便买几瓶啤酒犒劳犒劳自己大笑。这应该是关联分析最有名的一个例子了。

Apriori算法目前是数据挖掘中简单关联规则技术的核心算法,它包括两个部分:1.产生频繁项集 2.依据频繁项集产生简单关联规则

假设超市有一组购物记录,为方便分析,我们给各个物品贴上数字标签:

        纸巾---1   尿布---2   啤酒---3   牙刷----4   口红----5

        那么某个时间段8位客户在超市的购物记录可以表示为[[1,2,3],[2,3],[1,2,3,5],[1,3,4],[2,3,5],[2,5],[2,3,4,5],[1,3]]


相关名词:

#########################################################

        频繁项集Lk:那些经常出现在一起的物品的集合,例如{啤酒,尿布}。包含1个项目的频繁项集记为L1,包含2个项目的频繁项集记为L2,..依次类推。

        支持度:数据集中包含该项集的记录所占的比例。例如之前的8条购物记录中2和3的组合共出现5次,那么{啤酒,尿布}的支持度为5/8

规则

        可信度

        Apriori原理:如果每个项集是非频繁的,那么它的超集也是非频繁的,也就不必计算它的超集的支持度了。例如{3,4}是非频繁的,那么{1,3,4}和{2,3,4,5}都是非频繁的。Apriori原理帮助我们有效地减少了计算复杂度。

        候选集Ck:有可能成为频繁项集的项目集合

         k: 项集所包含的元素个数,也是迭代的次数(第k次迭代的目的是从Ck中寻找Lk)

 ###########################################################      

一.得到频繁项集

现在结合例子描述Apriori算法:

         (1)第一次迭代:在候选集C1中寻找频繁项集。 C1={1,2,3,4,5},计算C2中各个项目{1},{2},{3},{4},{5}的支持度,支持度大于阈值的进入L1。本例中L1={1,2,3,5}

         (2)第二次迭代:在L1的基础上首先产生C2.。Apriori算法通过Lk*Lk产生候选集,本例中C2=({1,2},{1,3},{1,5},{2,5},{3,5}),在C2中所有2-项集的支持度,支持度大于阈值的进入L2

         (3)重复以上步骤,直到无法产生候选项集为止


这里需要考虑的一个问题是,在Lk的基础上如何快速有效的生成Ck+1 ,L1生成C2的情况还算简单,只要对L1各元素进行组合,但是从L2生成C3呢?问题就有点复杂了。

          若L2=[[1,2,],[1,3],[1,5],[2,5],[3,5]]  将L2中的元素两两组合会产生一系列问题,例如[2,5]和[3,5]求并集产生[2,3,5],但由于[2,3]不是频繁项集,[2,3,5]不符合条件。为了避免这类问题的发生,一个巧妙的方法出现了:只有Lk中两两元素前k-1项相同时,才把这两者组合取并集。

         

def aprioriGen(Lk,k):
	sList=[]
	for i in range(len(Lk)):
		for j in range(i+1,len(Lk)):
			Lk1=list(Lk[i])[:k-1]
			Lk2=list(Lk[j])[:k-1]
			if Lk1==Lk2:
				sList.append(Lk[i]|Lk[j])
	return sList
         

这个方法避免了两个频繁项集求并集得到一个非频繁项集,而且大大减少了计算的复杂度。


二.产生关联规则

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值