一种基于Apriori的关联规则挖掘算法

 一种基于Apriori的关联规则挖掘算法
周政尹1,闫仁武1
(1江苏科技大学电子信息学院,镇江212003)
摘要:Apriori算法为经典的关联规则挖掘算法,其中一个重要的步骤为剪枝(pruning),剪枝操作需要将每个后选集的每个子集跟上一层频繁项集匹配,然后根据Apriori性质删除相应的非频繁项集。这一操作是Apriori算法的一个耗时因素,本文设计的这一算法NPA(No Pruning Apriori)在原Apriori算法的基础上通过改进JOIN方法,省去了剪枝操作,从而使算法速度得到明显提高,具有一定的实际应用价值。
关键词:数据挖掘,关联规则,Apriori, NPA
Data Mining Algorithms of Association Rules Based on Apriori
Zhou Zhengyin1, Yan Renwu1
(1School of Electronics and Information, Jiangsu University of Science and Technology, Zhenjiang212003, China)
Abstract: Apriori Algorithm is one of the classic data mining algorithms of association rulesOne important step of Apriori is pruning, which matches every subset of the candidates with the frequent sets of previous layer, and then those infrequent sets will be removed according to one character of AprioriThis operation becomes the fact of time-cost of AprioriA new algorithm named NPA(No Pruning Apriori) referred in this article is based on Apriori and, by means of modifying the JOIN operation, the pruning operation has been canceledSuch improvement enhances the speed of the algorithm and it brings practice application value in a certain degree.
Key words: Data Mining, Association Rules, Apriori, NPA
一、引言
关联规则算法主要是经典的频集方法(基于Apriori的频集方法)。Agrawal等人于1993年首先提出了挖掘客户交易数据库中项集间的关联规则问题,其核心方法是基于频集理论的递推方法。虽然Apriori算法自身已经进行了一些优化,但在实际应用中还是不能令人满意,后来出现的关联规则挖掘算法,多是对原有理论的改进和优化,如采用采样、并行、划分的思想等,以提高算法的效率。也有一些是原有算法的变体,如泛化的关联规则、周期关联规则等等。
Apriori算法时间消耗的主要症结反映在两个方面:一是对海量数据库的多趟扫描,另一方面是用连接操作产生后选频繁项集,很多改进的算法也都是针对这两个方面去解决的。
二、关联规则基本模型
设I={i1,i2,i3,…im}为所有项目的集合,D为事务数据库,事务T是一个项目子集(T I)。每一个事务都具有唯一的事务标识Tid。设A是一个由项目构成的集合,称为项集。事务T包含项集A,当且仅当A T。如果项集A中包含k个项目,则称为k项集。项集A在事务数据库D中出现的次数占D中总事务的百分比叫做项集的支持度。如果项集的支持度大于用户给定的最小支持度阈值,就称该项集是频繁项集(或大项集)。
关联规则是形如X Y的逻辑蕴涵式,其中X I,YI,X Y= 。如果事务数据库D中有s%的事务包含X∪Y,则称关联规则X Y的支持度为s%,实际上,支持度是一个概率值。若项集X的支持度记为support(X),规则的信任度为support(X∪Y)/support(X)。这是一个条件概率P(Y|X)。也就是:
Support(X Y)=P(X∪Y)
Confidence(X Y)=P(Y|X)
关联规则就是支持度和信任度分别满足用户给定阈值的规则。发现关联规则主要分两个步骤:
(1) 找出所有频繁项集。
(2) 有频繁项集生成满足最小信任度的规则。
进行关联规则挖掘时,决策者需要输入两个参数:最小支持度minsup和最小信任度minconf。前者即用户规定的关联规则必须满足的最小支持度,它表示了一组事务集在统计意义上所需满足的最低程度;后者即用户规定的关联规则必须满足的最小信任度,它反映了关联规则的最低可靠程度。
三、Apriori算法
Apriori算法是很多关联规则算法的基础,算法名字源于算法使用了频繁项集性质的先验(Prior)知识。Apriori算法过程主要分为两步:第一步通过迭代找出事务数据库D中的所有频繁项集,即支持度大于等于用户预先设定的minsup的项集;第二步利用第一步找出的频繁项集构造出满足用户给定最低信任度minconf的有用规则。
Apriori算法中检索所有频繁项集是整个算法的核心。
Agrawal等已经证明了关联规则具有如下性质:
性质1 频繁项集的子集必定是频繁项集。
性质2 非频繁项集的超集一定是非频繁的。
Apriori算法利用性质1,通过已知的频繁项集构成长度更大的项集,并将其称为后选频繁项集。后选频繁k项集的集合Ck是指由可能成为频繁k项集的项集组成的结合。之后只需要计算后选频繁项集的支持度,而不必计算所有不同项集的支持度,因此减少了部分计算量。Apriori具体算法如下:
(1)L1={频繁1项集};
(2)for(k=2;Lk-1≠ ;k++) do begin
(3) Ck=apriori_gen(Lk-1);
(4) for all transactions t∈D do begin
(5) Ct=subset(Ck,t);
(6) for all candidates c∈Ct do
(7) c.count++;
(8) end;
(9) Lk={c∈Ck | c.count≥minsup}
(10) end;
(11)Answer= kLk;
apriori_gen()函数以Lk-1为参数,用Lk-1和Lk-1进行连接操作生成一个超集作为后选频繁项集。
Procedure apriori_gen()
(1)insert into Ck
(2)select p[1],p[2],p[3],…,p[k-1], q[k-1]
(3)from Lk-1p, Lk-1q
(4)where p[1]=q[1],…,p[k-2]=q[k-2],p[k-1]然后就是剪枝(Prune)操作,剪枝是基于这样一个原因:任何非频繁的(k-1)项集必定不是频繁k项集的子集,所以当后选k项集的某个(k-1)子集不是Lk-1中的成员时,则该后选频繁项集不可能成为频繁项集,应当从Ck中删除。表达为:
(1)for all itemsets c∈Ck do
(2)for all(k-1)-subsets s of c do
(3) if(s Lk-1) then
(4) delete c from Ck
四、对Apriori算法的改进
虽然Apriori算法自身已经进行了一定的优化,但是在实际应用中仍然不能令能满意,原因是算法进行多趟扫描数据库、多次连接操作等都是相当耗时的工作。下面我们把焦点定在剪枝操作上。
假定有9个客户编号分别为(T1,T2,T3,T4,T5,T6,T7,T8,T9);交易数据库中分别保存了这9位客户的购物记录
T1 I1,I2,I5
T2 I2,I4
T3 I2,I3
T4 I1,I2,I4
T5 I1,I3,
T6 I2,I3
T7 I1,I3
T8 I1,I2,I3,I5
T9 I1,I2,I3,
其中I1,I2,I3,I4,I5分别五种商品。根据Apriori算法我们可以得到频繁2项集
L2={{ I1,I2},{ I1,I3},{ I1,I5},{ I2,I3},{ I2,I4},{ I2,I5}},再在此基础上进行连接操作,得到后选3项集C3={{ I1,I2,I3},{ I1,I2,I5},{ I1,I3,I5},{ I2,I3,I4 },{I2,I3,I5},{ I2,I4,I5}},至此,我们再分析算法将如何进行剪枝操作的:扫描C3中的每一个3项集Xi,检索的所有2项子集,然后扫描L2,假如Xi的某一个2项子集不在L2中,说明Xi不是频繁项集(性质2),因为所有的频繁2项集都已经包含在L2中。显然,这样的计算是相当耗时的,其时间复杂度为O(m*(n/2)*C ),其中m为C3的长度,n为L2的长度,k在这里为3(3项集)。可以想象,当交易量和交易数据库规模很大时Apriori算法光在剪枝操作上的耗时就十分惊人。
笔者对原有Apriori算法进行了改进:剪枝操作可以通过连接操作的优化而省去,算法的改进基于“被剪项集(非频繁项集)是可以预测的”这个事实。仍以上述情况为例,对L2中项集进行连接,首先是{ I1,I2}和{ I1,I3},连接后得到{ I1,I2,I3},除了原先的{ I1,I2}和{ I1,I3},{ I1,I2,I3}的另外一个2项子集{ I2,I3}可以在L2中找到,这样的产生的后选项集{ I1,I2,I3}就可以保留,再看{ I1,I3}和{ I1,I5},连接后得到{ I1,I3,I5},除了原先的{ I1,I3}和{ I1,I5},另外一个2项子集{ I3,I5}不包含在L2中,由剪枝原理知,这样的项集不是频繁项集,不应该保留。
改进后的一般算法如下:
Procedure apriori_gen ()
(1)insert into Ck
(2)select p[1],p[2],p[3],…,p[k-1],q[k-1]
(3)from Lk-1p, Lk-1q
(4)where p[1]=q[1],…,p[k-2]=q[k-2],p[k-1](5)and subItems([p[1],p[2],p[3],…,p[k-1],q[k-1]],k) Lk-1
其中
Procedure subItems (candidate c, k)
(1)for (i=1;i(2) subset s[i] = c[1],c[2],…c[i-1],c[i+1],…c[k-3],c[k-2]
(3) candidate t[i] = s[i],c[k-1],c[k]
(4)end
(5)return t
该算法保留了Apriori算法的主体流程,对连接操作做了修改:若已经产生了上一层的频繁项集Lk-1,对Lk-1中的每一对项集做连接生成c,将c分成两部分:c[1],c[2],…c[k-2]和c[k-1],c[k],检索c包含的所有可能为非频繁的k-1项集,这些项集也分为两部分,第一部分来自c[1],c[2],…c[k-2]中的k-3个项集,另一部分即为c[k-1],c[k]。事实上,这样检索到的所有k-1项集比c包含的所有k-1项集少2个,这两个即是用来连接产生c的那两个频繁项集,因此不需要再将其考虑进去。
根据上面所述,这样改进了连接操作之后,可以保证产生的后选项集的子集也不包含非频繁项集,因此不再需要做烦琐的剪枝操作,可以省去大量计算工作。在下面的实验中我们可以看到改进后的算法相对于原有算法的优越性。
五、实验及性能分析
我们依然以上述的客户购物交易记录为例,假设用户给定的最小支持度minsup为2/9。我们先看改进后的算法是如何产生所有频繁项集的。
(1)扫描交易数据库D,得到后选1项集C1={{ I1},{ I2},{ I3},{ I4},{ I5}},其支持度分别为(6,7,6,2,2),因此L1 =C1。
(2)将L1与L1由连接算法产生L2={{ I1,I2 },{ I1,I3 },{ I1,I5},{ I2,I3 },{I2,I4 },{I2,I5}}。
(3)由L2与L2连接得到C3={{ I1,I2,I3},{ I1,I2,I5}},计算支持度后得到L3={{ I1,I2,I3},{ I1,I2,I5}}。
(4)由L3与L3连接得到C4= ,算法结束。
其中第三步的C3是这样得到的,首先考虑连接{ I1,I2 },{ I1,I3 },得到{ I1,I2,I3 },除了{ I1,I2 }和{ I1,I3 },另外一个2项子集{ I2,I3 }包含在L2中,根据算法,{ I1,I2,I3 }就可以保留下来,而考虑连接{ I2,I3 },{ I2,I4 },得到{ I2,I3,I4 }中的一个子集{ I3,I4 }不包含在L2中,根据算法{ I2,I3,I4 }不能保留。
下面对原有的Apriori算法和改进后的算法NPA做一个比较。
步骤 Apriori算法 NPA算法
1 C1 { I1},{ I2},{ I3},{ I4},{ I5} { I1},{ I2},{ I3},{ I4},{ I5}
2 L1 { I1},{ I2},{ I3},{ I4},{ I5} { I1},{ I2},{ I3},{ I4},{ I5}
3 C2 { I1,I2 },{ I1,I3 },{ I1,I4},{ I1,I5 },{I2,I3 },{I2,I4},{I2,I5},{ I3,I4 },{ I3,I5},{ I4,I5 } { I1,I2 },{ I1,I3 },{ I1,I4},{ I1,I5 },{I2,I3 },{I2,I4},{I2,I5},{ I3,I4 },{ I3,I5},{ I4,I5 }
4 L2 { I1,I2 },{ I1,I3 },{ I1,I5},{ I2,I3 },{I2,I4 },{I2,I5} { I1,I2 },{ I1,I3 },{ I1,I5},{ I2,I3 },{I2,I4 },{I2,I5}
5 C3 { I1,I2,I3},{ I1,I2,I5},{ I1,I3,I5},{ I2,I3,4},{ I2,I3,I5},{ I2,I4,I5} { I1,I2,I3},{ I1,I2,I5}
6 L3 { I1,I2,I3},{ I1,I2,I5} { I1,I2,I3},{ I1,I2,I5}
7 C4 { I1,I2,I3,I5}

8 L4

很显然,改进后的算法约简了后选项集的规模,而原有的Apriori算法从后选k项集生成k项频繁项集还需要做大量计算,改进后的算法由后选k项集生成k项频繁项集只需要计算支持度即可,因此这种算法上的改进大大减少了计算工作量,从而达到了提高算法效率的目的。
六、结论
本文提出的NPA算法,本质上是将判断潜在非频繁项集这一工作提前了。Apriori算法的剪枝操作放在连接操作之后需要重新扫描数据库,而NPA算法将判断潜在非频繁项集在连接的过程中同步完成,不需要额外扫描数据库。另外,从跟原有Apriori算法的比较中可以预见,当交易数据库的规模和长度增大时,两种算法的效率差异会更加明显。计算效率一直是Apriori算法的一个障碍,因此本文提出的改进算法具有一定的实际应用价值。
参考文献:
[1] Agrawal C C, Yu P S. Online generation of association rules [A] In: Proceedings of the 14th International Conference on Data Engineering [c] Orlando, Florida, USA.1998.402—4l1.
[2] Agrawal R, Srikant R. Mining sequential patterns: generalizations and performance improvements [A]. In: Proceeding of the International Conference on Extending Database Technology [c]. New York: Springer Verlag,1996. 3.17.
[3] Jiawei Han, Micheline Kambe Data Mining: Concepts and Techniques [J] organ Kaufmann Publishers, 2000.
[4] Data warehousing, data mining, and OLAP McGraw-Hill Book Co1997
[5] Robert LGrossman...et al Data mining for scientific and engineering applications Kluwer Academic Pub, c2001.
[6] Rakesh Agrawal, Ramakosnan Sokant Fast Algorithms for Mining Association Rules [A] Proc of the 20th VLDB Conf[C] 1999.33~ 45
[7] Jiawei Han,Jian Pei.Simon Fras&Sequential Pattern Mining [M] From Shopping History Analysis to Weblog and DNA Mining University,1998.
[8] 雄飞,李军等。 数据挖掘与知识发现。 北京:高等教育出版社,2003.11
[9] 火松。 数据仓库与数据挖掘技术。 北京:科学出版社,2004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值