当前位置:文档之家› 关联规则挖掘算法研究

关联规则挖掘算法研究

关联规则挖掘算法的研究摘要:Apriori算法是发现频繁项目集的经典算法,但是该算法需反复扫描数据库,因此效率较低。

本文介绍了Apriori算法的思想,同时对已经提出的经典的关联规则更新算法FUP和IUA算法进行分析,指出其优缺点;最后对另外的改进算法,做一个简单的叙述。

关键词数据挖掘;关联规则;Apriori算法Keywords:data mining;relation rule;Apriori algorithm关联规则反映了数据库中数据项目之间有趣的关联关系,而其中发现频繁项目集是关联规则挖掘应用中的关键技术和步骤。

关于频繁项目集的挖掘算法研究,人们对此进行了大量的工作,其中以R. Agrawal 等人提出的Apriori 、AprioriTid 等算法最具有影响力和代表性。

而这些算法的提出都是在挖掘数据库和最小支持度不变的条件下进行的。

但实际中,遇到的情况可能是:随着时间的推移,挖掘数据库的规模可能不断膨胀或需要删除一部分记录,或者需要对最小支持度进行调整从而逐步聚集到我们感兴趣的频繁项目集上。

因而如何从数据发生变动后的数据库中高效地对已经推导出的关联规则进行更新,具有非常重要的应用价值,这就是所谓的增量式挖掘关联规则的问题。

1关联规则问题描述:设I={i1,i2,...,i m}是m个不同项目的集合,给定一个事务数据库D,其中D每一个事务T是I中一组项目的集合,即T I,T有一个惟一的标志符TID。

如果对于I中的一个子集X,有X T,我们就说一个事务T包含X。

一条关联规则(association rule)就是一个形如X =>Y的蕴涵式,其中X,Y T,而X∩Y=Φ。

关联规则成立的条件是:①它具有最小支持度s,即事务数据库D中至少有s%的事务包含X∪Y;②它具有最小可信度c,即在事务数据库D中包含X的事务中至少有c%同时也包含Y。

给定一个事务集D,挖掘关联规则问题就是产生支持度和可信度分别大于用户给定的最小支持度和最小可信度的关联规则,也就是产生强规则的问题。

关联规则的挖掘问题可以分解为以下两个问题:(1) 找出事务数据库中所有具有用户最小支持度的项目集。

具有用户指定最小支持度的项目集称为频繁项目集,反之称为非频繁项目集。

一个项目中所含项目的个数称为该项目的长度。

(2) 利用频繁项目集生成关联规则。

对于每一个频繁项目集A,若B A,B≠Φ,且support(A)/support(B)>minconf,则有关联规则B=> (A-B)。

目前大多数的研究主要集中在第一个问题上面。

2 Apriori核心算法Agrawal等人于1994年提出了一个挖掘顾客交易数据库中项集间的关联规则的重要方法Apriori算法,其核心是基于两个阶段频繁项集思想的递推算法。

算法的基本思想是首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。

然后由频繁项集产生强关联规则,这些规则必须满足最小支持度和最小可信度。

Apriori核心算法思想简要描述如下:该算法中有两个关键步骤连接步和剪枝步。

(1) 连接步:为找出Lk(频繁k一项集),通过Lk-1与自身连接,产生候选k-项集,该候选项集记作Ck;其中Lk-1的元素是可连接的。

(2) 剪枝步:Ck 是Lk 的超集,即它的成员可以是也可以不是频繁的,但所有的频繁一项集都包含在Ck 中。

扫描数据库,确定Ck 中每一个候选的计数,从而确定Lk(计数值不小于最小支持度计数的所有候选是频繁的,从而属于Lk)。

然而,Ck 可能很大,这样所涉及的计算量就很大。

为压缩Ck ,使用Apriori 性质:任何非频繁的(k-1)-项集都不可能是频繁k-项集的子集。

因此,如果一个候选k-项集的(k-1)项集不在Lk 中,则该候选项也不可能是频繁的,从而可以由Ck 中删除。

这种子集测试可以使用所有频繁项集的散列树快速完成。

这个方法要求多次扫描可能很大的交易数据库,即如果频集最多包含10个项,那么就需要扫描交易数据库10遍,这需要很大的I/O 负载。

可能产生大量的候选集,以及可能需要重复扫描数据库,是Apriori 算法的两大缺点。

3 关联规则增量更新关联规则反映了数据库中数据项目之间有趣的关联关系,而其中发现频繁项目集是关联规则挖掘应用中的关键技术和步骤。

关于频繁项目集的挖掘算法研究,人们对此进行了大量的工作,其中以R. Agrawal 等人提出的Apriori 、AprioriTid 等算法最具有影响力和代表性。

而这些算法的提出都是在挖掘数据库和最小支持度不变的条件下进行的。

实际中,数据库的规模随着时间,可能不断膨胀或需要删除一部分记录,或者需要对最小支持度进行调整从而逐步聚集到我们感兴趣的频繁项目集上。

因而如何高效地从更新后的数据库中对已经推导出的关联规则进行更新是具有非常重要的价值的,这就是关联规则增量更新问题。

广义上的关联规则的更新问题就是,在原有数据库DB 的基础上,对其加上(或减去)数据库db ,在新的数据库DB 上挖掘新关联规则的问题。

关联规则的增量式更新问题主要有三个:①在给定的最小支持度和最小置信度下,当一个新的数据集db 添加到旧的数据库DB 中时,如何生成db ∪DB 中的关联规则;②在给定的最小支持度和最小置信度下,当从旧的数据库DB 中删除数据集db 时,如何生成DB-db 中的关联规则;③给定数据库DB ,在最小支持度和最小置信度发生变化时,如何生成数据库DB 中的关联规则。

文献[2]中Agrawal R ,和Srikant R 提出的FUP 算法是一个与Apriori 算法相一致的针对第一个问题的更新算法。

文献[3]中,Brin S , Motwani R , 和Silverstein C 提出的 FUP2算法是一个同时考虑第一个问题与第二个问题的算法。

第三类问题则有冯玉才、冯剑琳提出的算法IUA 和PIUA [7]。

下面给出两个比较经典算法:FUP 和IUA 算法的基本思想,并分析了各自的优缺点。

(1) FUP 算法的基本思想对任意一个k (k ≥1)项集,若其在DB 和db 中都是频繁项集,则其一定是频繁项集;若其在DB 和db 中都是非频繁项集,则其一定是非频繁项集;若其仅在DB(db)中是频繁项集,则其支持计数应加上其在db(DB)中的支持数以确定它是否为频繁项集。

FUP 算法假设在DB 中发现的频繁项集Li L U ni 1== (n 为L 中最大元素的元素个数)已被保存下来。

它需要对DB 和db进行多次扫描,在第一次扫描中,算法先扫描db ,将L 1中的元素仍为db ∪DB 中的频繁项集的元素记入L 1′,并生成候选频繁1项集C 1,C 1中的元素为db 中的频繁1项集且不包含在L 1中;然后扫描DB 以决定C 1中的元素是否为db ∪DB 中的频繁项集,并将是db ∪DB 中的频繁项集的元素记入L 1′中。

在第k (k>1)此扫描前,先对L k-1′用Apriori_Gen 函数生成候选频繁k 项集C k ,并除去L k 中的元素,即C k =C k - L k ,对L k 进行剪枝,即对于XÎL k ,若存在X Y ⊂且YÎ L k-1 – L k-1′,则X 肯定不是db ∪DB 中的频繁k 项集,应将其在L k 中删除;然后扫描db ,将L k 中的元素仍为db ∪DB 中的频繁项集的元素记入L k ′,记录候选频繁k 项集C k 中的元素在db 中的支持数;最后扫描DB ,记录C k 中的元素在DB 中的支持数,扫描结束时,将C k 中是db ∪DB 中频繁项集的元素记入L k ′中。

算法在L k 和C k 均为空时结束。

性能分析:FUP 算法利用原数据库集DB 的挖掘结果,即频繁项集L ,需要对DB 和db 进行n 次扫描(n 为L 中最大的元素的元素个数),最后得到DB ∪db 中的频繁项集L′,所以FUP 算法的效率比使用Apriori 算法和DHP 算法重新对db ∪DB 进行挖掘的效率要高得多。

不过,FUP 算法也存在其缺点,虽然它利用此算法利用了原数据库集DB 的挖掘结果,但是在对新的数据库进行更新时,又需要重复的扫描原数据库DB ,对候选集进行模式匹配,因为原数据库集DB 相对增加的数据集db 是很大的,所以在利用FUP 算法对关联规则进行更新时,会消耗大量时间处理规模巨大的候选集,浪费了时间。

(2) IUA [3]算法基本思想算法IUA 采用了一个独特的候选频繁项集生成算法iua_gen ,在对每一次对数据库DB 扫描之前生成较小的候选频繁项集,从而提高了算法的效率。

它也要求上一次对数据库DB 进行采掘时发现的频繁项集Li L U ni 1== (n 为L 中最大元素的元素个数)在本次挖掘时是可使用的。

因为人们在发现关联规则时, 常常需要不断地调整最小支持度和最小可信度来聚集到那些真正令其感兴趣的关联规则上, 因而该算法具有很重要的意义。

IUA 算法的基本框架也和Apriori 算法一致, 也需要对交易数据库DB 进行多趟扫描. 因为有s′< s , 所以原来所有的频繁k 项目集(L k ) 在新的最小支持度下仍然是频繁k 项目集, 因此在每一趟中扫描交易数据库D 计算候选k 项目集的支持度计数时, 我们就没有必要再考虑一遍L k 对应的候选k 项目集。

如果更进一步希望避免又重新生成一遍L k 对应的候选k 项目集, 我们可以考虑采取以空间换时间的策略, 只要在Apriori 算法中的每一趟k , 保存相应的(C k -L k ) 即可。

在第1趟扫描中,IUA 算法只对原来不在L1中的单个项目进行支持度计算,并确定出所有新的频繁1 项目集L1″,然后通过L1″∪L1 得到L1′。

利用一个频繁项目集的任意一个子集必定是频繁项目集这一性质,频繁k 项集c 的每一单个项目i 所对应的频繁1项集{i}或者从L1中取,或者从L1″中取。

根据这一特点,IUA 算法将具有新支持度s′的所有频繁k(k≥2)项目集分成3类:①对于其中的每一个频繁k 项目集c= {i 1, i 2,. . .,i k }, P j (1≤j ≤k ),必有{i j }∈L 1; ②对于其中的每一个频繁k 项目集c= {i 1, i 2,. . ., i k }, P j (1≤j ≤k ),必有{i j }∈L1″; ③对于其中的每一个频繁k 项目集c= {i 1, i 2,. . ., i k }, 必有两个非空子集c1 和c2, 使得c1∪c2= c , c1∩c2= Φ, 而且c1< L1, c2< L1″。

我们将所有第①类频繁k 项目集构成的集合记为L 1k , 第②类记为L 2k , 第③类记为L 3k . 同时与之相对应的候选k 项目集构成的集合分别记为C 1k , C 2k , C 3k .对于C 1k , C 2k 直接利用Apriori 算法分析:算法中的apriori-gen 函数生成;对于C 3k 通过L j 1和L k-22拼接修剪而成,j 从1迭代到k-1。

相关主题