摘 要:分析传统apriori效率较低的原因,采用0-1矩阵改进数据库事务集的描述,提高apriori中统计匹配的时间效率;分析各频繁项集的计数,改进传统apriori算法完全从低维频繁项集产生高维频繁项集的方式,通过先求出1项频繁集和最大频繁项集,减少中间的频繁项集剪枝数量,从而达到提高算法效率的目的。
关键词:0-1矩阵;统计匹配;剪枝
1 关联规则[1]挖掘及apriori算法概述
一提到关联规则挖掘就会令人联想到“尿布与啤酒”的故事,这是借助数据挖掘技术对大量原始交易数据进行分析揭示的一条规律。 apriori[2]算法是由美国学者r. agrawal等在1993年提出的一种从大规模商业数据中挖掘关联规则的有效方法。现在已经被广泛用于商业决策、社会科学、科学数据处理等各种各样的数据挖掘领域之中。使用基于支持度的剪枝技术,系统地控制候选项集指数增长。其核心是使用候选项集找频繁项集。算法具体的执行步骤如下:
(1)根据用户的要求确定最小支持度和最小置信度;(2)找出所有的频繁项集:先由数据库读入所有的数据项,得出候选1项集c1,然后根据最小支持度要求确定频繁1项集l1;使用l1与l1自连接产生候选2项集c2,继续对数据库扫描,得出候选2项集c2的支持度,确定频繁2项集l2;继续执行上述的步骤,不断进行连接与剪枝,重复对数据库的扫描,并和最小支持度进行比较,产生更高层次的频繁项集,直到不再产生新的候选频繁项集为止;(3) 根据频繁项集产生强关联规则。
2 apriori算法的缺点及改进方法
apriori算法能够有效地进行数据关联规则挖掘,但该算法存在效率不高的问题。该算法使用迭代方法,通过低维频繁项集产生高维频繁项集,该算法存在两个比较明显的缺点:一个是可能产生大量的候选集,时间开销和空间开销都很大;另一个是需要多次扫描数据库,需要很大的 i/o开销。
2.1 采用0-1矩阵描述数据库事务集
设i={i1,i2,…,in}是项的集合,d是数据库事务集,其中每个事务t是项的集合,使得t?哿i。按如下规则用0-1矩阵描述数据库事务集:如果i中某一项ik在事务t中存在,用“1”表示,否则就用“0”表示。数据库事务集d就转化为m*n矩阵的0-1矩阵,其中m为数据库事务集d 的大小,即包含多少个事务,n为集合i的计数。
采用0-1矩阵描述数据库事务集能带来如下好处:
(1)运算简单;便于统计,横向统计“1”的个数就是事务t包含的项数,纵向统计“1”的个数就是1项集的统计数;(2)使用0-1矩阵算法,提高统计项集时候的匹配效率,传统的统计匹配效率正比于n^2,采用0-1矩阵匹配时间效率正比于n;(3)减少对数据库的扫描,排序后,求频繁k项集的时候,统计项集时不需要扫描数据库,只需要统计包含大于等于k个项目数的事务;(4)易于对数据库事务集按事务包含的项目数大小降序排序;(5)易于求出最大频繁项集。
2.2 改进后的算法 myapriori描述
要提高apriori算法的效率,一般来说就是要考虑两个方面的问题:一是减少对数据库的扫描,二是在剪枝的时候减少统计项集的次数。采用 0-1矩阵,并排序以后,可以减少对数据库的扫描,在求k项频繁项集时候,只需要扫描包含大于等于k个项目的项集,不需要扫描全部的数据库。传统 apriori算法采用从频繁1项集开始,由频繁k-1项集产生频繁k项集,中间产生大量候选集,对这些候选集要进行统计并剪枝,运算量大;通过多次试验发现:对于1项频繁集,2项频繁集,……,m-1项频繁集,m项频繁集(m项频繁集为最大频繁项集),其数量分布有一定规律,就是两头的数量相对较少,尤其是最大频繁项集数量不多,中间频繁项集的数量较多,数量分布整体呈现为“纺锤状”。可以先通过统计的方法求出最大频繁项集,然后利用“频繁项集的所有非空子集一定也是频繁的”这一定理,再由k-1项频繁项集产生k项频繁项集时,剔除最大频繁项集的子集的项集,只需要统计分析剩余的项集是否为频繁项集即可,减少了剪枝的运算量,优化算法。算法myapriori:输入原始数据库事务集矩阵a,输出0-1矩阵fi表示的各项频繁项集。
上述算法的优点:在减少了剪枝的运算量,减少了数据库的扫描次数;缺点是对原始数据库0-1化处理、排序和统计产生最大频繁maxfi增加了额外开销,其中0-1化处理、排序要对数据库各扫描1次,统计产生最大频繁maxfi也
要对数据库进行扫描;其中0-1化处理、排序增加的开销并不是很大,统计产生最大频繁maxfi可能会带来较大的开销。总体来说,从时间效率上来讲,改进的算法优于传统的算法,尤其在maxfi比较容易求取的情况下;从空间效率来讲,改进后的算法要用到counta01、cca01、sa01等矩阵,效率会有所降低。
2.3 myapriori算法性能分析与实验
对某关于公积金数据库事务集{{t1:i1,i3,i4,i6};{t2:i2,i3,i4};{t3:i1,i2,i3;}; {t4:i2,i6};{t5:i2,i3,i4,i5};{t6:i2,i3,i5};{t7:i1,i2,i3,i4,i6}; {t8:i1,i3,i4,i5,i6};{t9:i1};{t10:i1,i5},令sup=0.3:
采用传统apriori算法,求1项频繁集时,有6个候选频繁项集,每个项集需要与原数据库匹配1次,原始数据库大小为10项,要匹配 6*10=60次,得到6个1项频繁集;求2项频繁集时,产生c62=15个候选频繁项集,每个项集需要与原数据库匹配1次,原始数据库大小为10项,要匹配15*10=150次,得2项频繁集有9项;求3项频繁集时,产生13个候选频繁项集,每个项集需要与原数据库匹配1次,原始数据库大小为10项,要匹配13*10=130次,得3项频繁集有5项;求4项频繁集时,产生3个候选频繁项集,每个项集需要与原数据库匹配1次,原始数据库大小为10项,要匹配3*10=30次,得4项频繁集有1项,4项频繁集即为最大频繁项集。在上述过程中,共计需要匹配的次数为:60+150+130+30=370。
采用改进后的算法myapriori算法,求1项频繁项集匹配60次,2项频繁项集匹配96次,3项频繁项集匹配76次,4项频繁项集匹配4 次,共计匹配236次,加上扫描2遍数据库,可近似计为2*10次=20次,总计为236+20=256次,小于传统apriori算法的370次;减少了对数据库的扫描和剪枝的运算量。
实验验证:采用matlab编程,2g内存,2.5g双核cpu, windows xp环境;使用gjj数据库,采用传统apriori算法和改进后的myapriori算法各运行10000次,时间分别为0.3440ms和 0.2950ms,可以得出改进后的算法更快。
参考文献
[1]jiawei han micheline kamber著.范明,孟小峰.数据挖掘概念与技术(加)[m].机械工业出版社,2008年12月.
[2]agrawal r,imielinskit, swami a.mining association rules between sets of items in large databases. proceedings of acmsigmod conference on management of data,1993:207-216.