关联规则挖掘的算法——Apriori算法

原创 2007年10月07日 20:49:00
 
Agrawal等于1993年[1]首先提出了挖掘顾客交易数据库中项集间的关联规则问题,其核心方法是基于频集理论的递推方法。以后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。他们的工作包括对原有的算法进行优化,如引入随机采样、并行的思想等,以提高算法挖掘规则的效率;提出各种变体,如泛化的关联规则、周期关联规则等,对关联规则的应用进行推广。
一、Apriori算法基本原理
Agrawal等在1993年设计了一个基本算法Apriori[4],这是一个基于两阶段频集思想的方法,将关联规则挖掘算法的设计可以分解为两个子问题:
1.         找到所有支持度大于最小支持度的项集(Itemset),这些项集称为频集(Frequent Itemset)。
2.         使用第1步找到的频集产生期望的规则。
为生成所有频繁项集,Aprior使用了递推的方法,其核心思想是:

 

(1)       L1 = find_frequent_1-itemsets(D);

 

(2) for (k=2;Lk-1 ≠Φ ;k++) {

 

(3)     Ck = apriori_gen(Lk-1 ,min_sup);

 

(4)     for each transaction t ∈ D {//scan D for counts

 

(5)        Ct = subset(Ck,t);//get the subsets of t that are candidates

 

(6)         for each candidate c ∈ Ct

 

(7)           c.count++;

 

(8)    }

 

(9)  Lk ={c ∈ Ck|c.count≥min_sup}

 

(10) }

 

(11) return L= ∪ k Lk;

 

 

Apriori算法的缺点:(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。
在论文[6]中,Agrawal等引入了修剪技术(Pruning)来减小候选集Ck的大小,由此可以显著地改进生成所有频集算法的性能。算法中引入的修剪策略基于这样一个性质:一个项集是频集当且仅当它的所有子集都是频集。那么,如果Ck中某个候选项集有一个(k-1)-子集不属于Lk-1,则这个项集可以被修剪掉不再被考虑,这个修剪过程可以降低计算所有的候选集的支持度的代价。文[6]中,还引入杂凑树(Hash Tree)方法来有效地计算每个项集的支持度。
首先扫描一次数据库,产生频繁1项集 L1;然后进行循环,在第k次循环中,首先由频繁k-1项集进行自连接和剪枝产生候选频繁k项集 Ck ,然后使用 Hash 函数把 Ck 存储到一棵树上,扫描数据库,对每一个交易T使用同样的 Hash 函数,计算出该交易T内包含哪些候选频繁k项集,并对这些候选频繁k项集的支持数加1,如果某个候选频繁k项集的支持数大于或等于最小支持数,则该候选频繁k项集为频繁k项集;该循环直到不再产生候选频繁k项集结束。
二、频集算法的几种优化方法
虽然Apriori算法自身已经进行了一定的优化,但是在实际的应用中,还是存在不令人满意的地方,于是人们相继提出了一些优化的方法。
1. 基于划分的方法。Savasere等[14]设计了一个基于划分(partition)的算法,这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频集至少在某一个分块中是频集保证的。上面所讨论的算法是可以高度并行的,可以把每一分块分别分配给某一个处理器生成频集。产生频集的每一个循环结束后,处理器之间进行通信来产生全局的候选k-项集。通常这里的通信过程是算法执行时间的主要瓶颈;而另一方面,每个独立的处理器生成频集的时间也是一个瓶颈。其他的方法还有在多处理器之间共享一个杂凑树来产生频集。
2. 基于hash的方法。一个高效地产生频集的基于杂凑(hash)的算法由Park等[10]提出来。通过实验我们可以发现寻找频集主要的计算是在生成频繁2-项集Lk上,Park等就是利用了这个性质引入杂凑技术来改进产生频繁2-项集的方法。
3. 基于采样的方法。基于前一遍扫描得到的信息,对此仔细地作组合分析,可以得到一个改进的算法,Mannila等[8]先考虑了这一点,他们认为采样是发现规则的一个有效途径。随后又由Toivonen[16]进一步发展了这个思想,先使用从数据库中抽取出来的采样得到一些在整个数据库中可能成立的规则,然后对数据库的剩余部分验证这个结果。Toivonen的算法相当简单并显著地减少了I/O代价,但是一个很大的缺点就是产生的结果不精确,即存在所谓的数据扭曲(data skew)。分布在同一页面上的数据时常是高度相关的,可能不能表示整个数据库中模式的分布,由此而导致的是采样5%的交易数据所花费的代价可能同扫描一遍数据库相近。Lin和Dunham在[7]中讨论了反扭曲(Anti-skew)算法来挖掘关联规则,在那里他们引入的技术使得扫描数据库的次数少于2次,算法使用了一个采样处理来收集有关数据的次数来减少扫描遍数。
Brin等[4]提出的算法使用比传统算法少的扫描遍数来发现频集,同时比基于采样的方法使用更少的候选集,这些改进了算法在低层的效率。具体的考虑是,在计算k-项集时,一旦我们认为某个(k+1)-项集可能是频集时,就并行地计算这个(k+1)-项集的支持度,算法需要的总的扫描次数通常少于最大的频集的项数。这里他们也使用了杂凑技术,并提出产生“相关规则”(Correlation Rules)的一个新方法,这是基于他们的[3]工作基础上的。
4. 减少交易的个数。减少用于未来扫描的事务集的大小。一个基本的原理就是当一个事务不包含长度为k的大项集,则必然不包含长度为k+1的大项集。从而我们就可以将这些事务移去,这样在下一遍的扫描中就可以要进行扫描的事务集的个数。这个就是AprioriTid的基本思想。

 

 

关联规则挖掘——Apriori算法

Apriori算法 一、关联规则挖掘问题可以这样来表述:设I={i1, i2···im}是一个项目集合,T={t1, t2···tn}是一个(数据库)事务集合,其中每个事务ti是一个项目...

数据挖掘——关联规则之Apriori算法

数据挖掘领域,关联规则是数据中一种简单但很实用的规则。发现关联规则的算法属于无监督学习的方法,常用的有三种:Apriori算法、基于划分的算法、FP-树频集算法。...

HAWQ + MADlib 玩转数据挖掘之(七)——关联规则方法之Apriori算法

一、关联规则简介        关联规则挖掘的目标是发现数据项集之间的关联关系,是数据挖据中一个重要的课题。关联规则最初是针对购物篮分析(Market Basket Analysis)问题提出的。假设...
  • wzy0623
  • wzy0623
  • 2017年08月09日 11:27
  • 425

GIS信息关联规则挖掘——Apriori算法的实现(下)

上篇说明了原理,这篇就直接上核心代码了~ 代码比较长,所以理解可能有点麻烦,核心思路就是计算选择的维度后遍历数据,逐步进行循环计算置信度,并淘汰每次循环后的最低值。 这里有一点要注意的,我...

关联规则挖掘——Apriori算法的基本原理以及改进

问题引入关联规则挖掘发现大量数据中项集之间有趣的关联或者相互联系。关联规则挖掘的一个典型例子就是购物篮分析,该过程通过发现顾客放入其购物篮中不同商品之间的联系,分析出顾客的购买习惯,通过了解哪些商品频...

关联规则挖掘——Apriori算法

前言 大二的时候,一个老师为了勾起我们对数据挖掘的兴趣,老是问我们这个问题:你们知道超市为什么要把啤酒跟尿布放在一起吗?但是从来没告诉我们答案。现在,很多人都听过这个问题,觉得很平常,但是那时的我真...

GIS信息关联规则挖掘——Apriori算法的实现(上)

最近闲着无聊没啥课,帮读master的朋友做了一个桌面端的GIS系统,主要功能是景区管理。 其中有个核心功能挺有意思的,就是统计所有景区受损设施的所有致损类型和每个类型具体包含的致损因子后,计算致损因...

机器学习实战——第十一/十二章:关联规则挖掘Apriori算法和FP-growth算法

本系列目的在于总结每一个分类器的特点(优点、缺点、使用数据类型、使用时的注意事项等)。相关代码自己搜。 python:建议使用2.7 python常用函数库:NumPy、sci...
  • mmc2015
  • mmc2015
  • 2015年06月29日 20:21
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关联规则挖掘的算法——Apriori算法
举报原因:
原因补充:

(最多只允许输入30个字)