http://blog.csdn.net/pipisorry/article/details/48901217
海量数据挖掘Mining Massive Datasets(MMDs) -Jure Leskovec courses学习笔记之关联规则Apriori算法的改进:基于hash的方法:PCY算法, Multistage算法, Multihash算法
Apriori算法的改进
{All these extensions to A-Priori have the goal of minimizing the number of pairs that actually have to be counted on the second pass.}
当频繁项对的数量比较大时,内存放不下,而这时对频繁项对进行计数时,可能会产生内存抖动,即内存页面频繁换入换出,因为不同的频繁项对计数器可能放在不同的页面上。
Apriori算法的改进算法
这些算法可以用在海量数据上的关联规则挖掘中。
(1)基于hash的方法。一个高效地产生频集的基于杂凑(hash)的算法由Park等提出来。通过实验可以发现寻找频集主要的计算是在生成频繁2-项集Lk上,Park等就是利用了这个性质引入杂凑技术来改进产生频繁2-项集的方法。
基于哈希的算法仍是将所有所有数据放入内存的方法。只要在计算的过程中能够满足算法对内存的大量需求,Apriori算法能够很好的执行。但在计算候选项集时特别是在计算候选项对C2时需要消耗大量内存。针对C2候选项对过大,一些算法提出用来减少C2的大小。这里我们首先考虑PCY算法,这个算法使用了在Apriori算法的第一步里大量没使用的内存。接着,我们考虑Multistage算法,这个算法使用PCY的技巧,但插入了额外的步骤来更多的减少C2的大小。类似的还有Multihash。
(2)基于划分的方法。Savasere等设计了一个基于划分(partition)的算法.这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频集至少在某一个分块中是频集保证的。
(3)基于采样的方法。基于前一遍扫描得到的信息,对此仔细地作组合分析,可以得到一个改进的算法,Mannila等先考虑了这一点,他们认为采样是发现规则的一个有效途径。
Apriori算法回顾
Apriori算法流程步骤图解
数据挖掘概念与技术中对Apriori算法的图解
Apriori算法的内存的使用情况
左边为第一步时的内存情况,右图为第二步时内存的使用情况
在第一步(对所有item扫描计数,并选出频繁一项集)里,我们只需要两个表,一个用来保存项的名字到一个整数的映射,用这些整数值代表项,一个数组来计数这些整数。
PCY算法使用了在Apriori算法的第一步里大量没使用的内存,该算法关注在频繁项集挖掘中的第一步有许多内存空间没被利用的情况。如果有数以亿计的项,和以G计的内存,在使用关联规则的第一步里我们将会仅仅使用不到10%的内存空间,会有很多内存空闲。
对Aprior进行改进:第一步扫描
从basket中统计项的个数用于寻找频繁一项集,并从每个basket中产生所有项对,并为项对创建一张hash表,hash表只是统计hash到本桶的项对的个数。