给定一个数据集合,Apriori算法需要通过初始扫描整个数据集合产生一个支持度不小于指定最小值的项目集合。生成该项目集合(称为1-候选集合)之后,再形成下一个候选集合(称为2-候选集合)。再次扫描数据库来计算2-候选集合的支持度。所有支持度小于最小值的集合将被剪裁掉。当不再生成新的候选集合时算法终止,得到k-候选集合。
该算法基于频繁项目集合的性质,即一个频繁集合的任何子集都是频繁集合;如果一个项目集合不是频繁集合,其所有超集均不是频繁集合。
之后又产生了一些Apriori算法的变型,如AprioriTID和AprioriHybrid。AprioriTID的工作原来与Apriori类似,所不同的是它通过用生成的项目集合来计算支持度,从而取代了Apriori算法中通过数据库扫描计算支持度的方法。据了解,只有当AprioriTID生成的项目集合能够放在内存时,AprioriTID才比Apriori效率更高。AprioriHybrid是Apriori和AprioriTID的混合体。该算法用Apriori进行初始扫描,一旦认为生成的集合能够与内存匹配则切换到AprioriTID算法。在大多数情况下AprioriHybrid算法比Apriori算法效率高,但是当进行到最后一次扫描时是个例外。这是因为它花费了过高的代价获取无意义的项目。Apriori算法比SETM和AIS算法更为高效。
1.2.3 随机采样和并行挖掘思想的引入
虽然Apriori算法已经能较好的实现关联规则挖掘技术的应用,但同样也存在着诸多缺陷。
于是研究人员对关联规则挖掘问题进行了深入的研究,通过引入随机采样和并行挖掘等思想,对原有算法进行了优化,以提高挖掘算法的执行效率。
J. S. Park等人[18]指出,Apriori算法的计算开销主要在频繁项目集的计算上,因此提出了基于Hash技术对生成的候选项目集进行裁剪的DHP算法。Apriori算法和DHP算法扫描数据库的次数是和最大频繁项目集的长度一致的,但是对大型数据库系统一次数据库扫描的代价是非常昂贵的,所以数据库扫描的次数成为关联规则挖掘算法的一个主要的瓶颈问题。
A. Savasere等人[18]提出了分区算法,该算法将数据库扫描的次数降为两次。分区算法在逻辑上将数据库划分为互不相交的若干个区,算法首先找出每个分区中的局部频繁项目集,然后根据“频繁项目集至少在一个分区中是频繁的”这一性质,合并所有的局部频繁项目集,最后对合并后所有的局部频繁项目集进行全局计数,得到全局频繁项目集。
H. Toivonen等人[18]提出了基于采样的关联规则挖掘算法,该算法通过数据库的一个随机采样数据生成候选频繁项目集,然后扫描整个数据库对其进行验证。基于采样的算法多数情况下只需扫描一次数据库,最坏的情况下也只需两次扫描,但该算法所获得的高效率是以牺牲挖掘精度来换取的,有可能丢失一些全局频繁项目集。
为了进一步提高算法的有效性,S. Brin等人[18]提出了动态项目集计数——DIC算法,该算法将数据库划分为若干分区并且对每个分区的开始做标记,不同于Apriori算法的是,在数据库扫描过程中,DIC算法可以在各个分区的标记点添加候选项目集,而不是像Apriori那样只能在每次完成整个数据库扫描之后添加候选项目集,这样便极大地减少了数据库扫描次数。
J. Han等人[18]提出了一种无需生成候选频繁项目集的算法频繁模式增长——FP-Growth算法,该算法首先将数据库压缩成一个高度浓缩的数据结构——FP树,随后发现频繁项目集的工作都在该FP树上完成,这样就避免了多次数据库扫描。另外,FP-Growth算法直接在FP树上发现频繁项目集,避免了产生数目庞大的候选频繁项目集,因此FP-Growth算法较Apriori算法的效率有一个量级的提高。 Apriori算法关联规则挖掘技术研究(2):http://www.751com.cn/jisuanji/lunwen_8940.html