Apriori和FPgrowth算法学习

这两天看了这两个算法,主要来源是机器学习实战。

1.Apriori算法

首先是两个定义

项集的支持度,定义为数据集中包含该项集的记录所占的比例。比如对于一个单独的item,那么item的支持度为item出现的数据集比上总的数据集,这里注意如果一个数 据条目中重复出现一个item多次,那么提取数据时只计算为1次,也就是我们并不关心某人买了两件商品0以及两件商品2的情况,只关心购买了商品0和商品2。

可信度(置信度),指规则的支持度,如{面包->牛奶}这条规则,为{面包,牛奶}的支持度比上{面包}的支持度

算法的主要原理:

如果一个项集是频繁的,那么他的子项集一定是频繁的,不如{0,1}这个项集出现100次,那么0和1也一定至少出现过100次。也就是说在算法运行过程中,如果我们知道

一个子项集的支持度小于阈值,那么就不用为这个子项集生成更大的项集了。如一旦计算出项集{2,3}的支持度小于阈值,那么就不用再计算{1,2,3}这样的项集了。

具体代码可参见教材。

代码中一个优化的地方是,利用两个k大小的子项集生成k+1项集时,只比较子项集的前k-1项,若这k-1项相同,那么就可以合并为一个k+1项集。比如,利用{1,3} ,{2,3}{3,5},{2,5}这几个项集生成3大小的项集时,可以只比较第一个,那么可以生成的项集为{2,3,5}。 原因是若一个k+1项集是频繁的,比如是{a1,a2,...a(k+1)}那么他必有两个子项集为{a1,a2,...a(k-1),ak}和{a1,a2,...a(k-1),a(k+1)}

2.FPgrowth算法

基本原理和Apriori相同,只不过在训练过程中采用了FP树,速度上会优于Apriori算法,在运用这个算法的过程中,我涉及到的数据集中有7851个item(大于阈值的估计有5000左右),最后生成的FreqList有300w条,算法运行时间在半小时左右,感觉速度上还可以满足要求。虽然最后发现的pattern不是很满意,进一步优化中。

你可能感兴趣的:(machine,learning)