您的位置:首页 > 其它

关联规则DHP算法详解

2016-09-29 17:05 267 查看
参考文献:
[1]Park, J. S., Chen, M. S., & Yu, P. S. (1995). Aneffective hash-based algorithm for mining association rules. Acm SigmodRecord, 24(2), 175-186.
[2]潘燕燕. (2012). 关联规则dhp算法的研究与分析. 佛山科学技术学院学报(自然科学版), 30(2), 30-32.

写在前面:上《数据挖掘》这门课的时候,讲关联规则挖掘(Association Rules Mining)的时候,其他几个算法都是简单易懂,符合普通认知规律的。唯有DHP算法是绕了一个小弯。无奈PPT上写的太简略,英文原文也是看得模棱两可。好在,找到了一个中文版的分析,再结合英文版,果然捋得清多了。写在这里,方便自己期末复习。



一、DHP算法的由来

1993 年Agrawal等人首先提出关联规则概念之后关联规则挖掘便迅速受到数据挖掘领域专家的广泛关注。在迄今十几年中,关联规则挖掘技术得到了较为深入的发展。
Apriori算法是关联规则挖掘经典算法,针对该算法的缺点,许多学者提出了改进的算法,主要有基于哈希优化DHP 和基于事务压缩等。

二、DHP算法的过程
1.缩减候选项目集Ck
对于表1 的数据库,算法的条件为:最小支持度为2。哈希函数为:h{ {x,y} }= ((order of x)+order of y) )mod 7 ,其中, order of x 为项目在所有取值序列中的序号。构造一个有效的Hash 函数很关键,因为一个较好的Hash 函数能减少冲突。这里为了方便说明DHP 算法的执行过程,取的哈希函数比较简单。例如,数据库D 中包含的事务项为A 、B 、C 、D 、E ,其中order of A 为1 ,order of C 为3 。



(1)生成候选1-项目集C1={{A} , {B} , {C} , {D} , {E}} ,并且扫描数据库所有事务,统计这些候选1-项目集的支持度,以得到L1。L1为{A,B,C,D,E}。
(2) 为C2建立用于快速统计的哈希表H2 。建表的方法是:对读取的每行事务根据要构造的候选集合的长度进行组合分解。例如,为构造候选2-项目集C2 而建立H2时,将数据库分解,如表2 所示。分别代入哈希函数,根据算得的哈希值填写哈希表。例如,对于2-项目集{B, D} , 带入哈希函数得:h{ {B ,D} }=((order of B)*10 十(order of D) )mod 7= (2*10 十4)mod 7=3 。
(3)DHP 检测每个项是否在哈希表中。如果是,它把该项的count 值加1 ;否则,它向哈希表中插入该项,并将count 值置为1 。表3 为给定数据库的哈希表及相应桶内取值情况。



(4)所有的桶组成一个位向量。位向量中每一位的取值与其对应的桶内元素的个数相关。如果个数大于minsup , 则为1 ,反之为0 。扫描数据库,得到2-项目集的同时,得到哈希表中的每个桶中含有放入到该桶中2-项目集的数目。由于最小支持度为2 ,得到结果位向量<1 , 1 , 0 , 1 , 0 , 0 , 1> 。也由C 1 得到了LI = { {A } , {B} , {C} , {D } , {E}}。将LI 进行自连接,得到 L1 * L1:{ {A ,C} , {A ,D
} ,{A ,E} , {B ,D} , {B ,E} , {C ,D } , {C ,E} , {D , E } }。分别将L1*L1 中的2 项目集带人哈希函数,得到每个2-项目集对应的哈希地址。然后,根据哈希表H2中的位向量取值,从L1*L1中过滤2-项目集,对应位向量为0的2-项目集组合将被删掉。最终得到C2={ {A ,C} , {A ,D } ,{A ,E} , {B ,D } , {C ,D } , {C ,E} , {D , E } }。
如果利用Apriori 算法,则将会得到:C2 ={ {A ,C} , {A ,D } ,{A ,E} , {B ,D } , {B ,E} , {C ,D } , {C,E} , {D , E } } 。由以上例子可以看出, DHP 算法使用哈希技术找出生成下一个候选项目集所必需的项目集,并且很好地缩小了候选数据的规模,提高了效率,特别是在生成候选集2-项目集的时候。
通过上述例子,可以发现在扫描一次数据库的过程中,DHP 算法在获得频繁k-项目集Lk 时与Apriori 算法一样[气都是通过L(k- I )来产生是k-项目集。但是不同之处于, DHP 前一次扫描的时候建立了位向量,并且巧妙地运用它来检测每个是项目集的合法性。DHP 并没有把从L(k-1)*L(k-1) 得到的所有项目集放到Ck 中,而是把通过哈希过滤的是k-项目集放到Ck 中,这样的哈希过滤可很快减少Ck
的大小。
通俗来说,哈希过滤的原理在于,哈希表的key为(X,X)经过处理之后得到的值,value为具有相同key的(X,X)的总个数。当具有相同key的(X,X)的总个数小于最小支持(Mininum Support)的时候,单独的(X,X)的个数一定是小于最小支持数的,所以这样就能过滤掉很大一部分候选集。当然,当具有相同key的(X,X)的总个数大于最小支持数(Mininum
Support)的时候,单独的(X,X)的个数不一定大于最小支持数的,所以还需要进行下一趟扫描。


2.缩减将事务集合Dk

原理:
count_support过程:如果一个交易t中含有(k+1)-项目集,那么该项目集中的每一个元素,至少都在C(k)中出现至少k次。严格来说,应该在L(k)中出现k次以上。举例说明,如果3-项目集中包含ABC,那么2-项目集中需要包含AB,AC,BC,也就是A,B,C在2-项目集中分别最少出现两次。
make_hasht过程:如果一个交易t中含有(k+1)-项目集,那么该项目集中的每一个元素,当其存在于某一个(k+1)项目集的时候,C(k)中必须包含该(k+1)项目集中的(k+1)个k-项目集。比如说C存在于ACD项目集中,那么C(k)中必须包含AC,AD,CD。
主要过程分为两步:
1)Procedure count_support:
首先来看一个例子。假设一个交易 t = {A, B, C, D, E},并且有5个2-项目集 { {A,C} , {A ,E } ,{A ,F} , {C ,D } , {E,F } }。定义一个数组a[i],其中,a[0]表示2-项目集中A的个数,a[1]表示2-项目子集中B的个数,a[2]表示2-项目集中B的个数依次类推。故,a[0]=3,a[2]=2,a[3]=1,a[4]=2,a[5]=2。由此可见,在2-项目集中,A,C,E,F的个数是大于2的。因此,不用考虑B和D,它们一定不会出现在3-项目集中。此时t-={A,
C, E, F}.
2)Procedure make_hasht:
事实上,项目C不可能出现在3-项目集中,因为假如出现在3-项目集中,就会有ACD,而在2-项目集中,只包含AC,CD,并不包含CD。也就是说,在count_support过程中,我们只能够确认某一元素存在的次数,却不能确认(k+1)-项目集中每个元素存在的次数。make_hasht过程就是用来解决这个问题的。
我刚开始接触的时候,疑惑在于,为什么在count_support过程中,对于k-项目集中的相同项目只计算一次,比如说{A,C}在多个交易中出现了两次或者三次。后来想通了,由k-项目集到(k+1)-项目集的过程中,只有不同项目组合才有用,多个{A,C}项目是没有办法组合到一块儿,变成3-项目集的。所以,k-项目集中的相同项目只计算一次。


三、总结

DHP 算法有以下主要恃点。
(1) 关联规则算法生成候选集的个数,从而提高了查找每个事务中候选项目集的速度,在很大程度上优化了Apriori 算法的性能瓶颈问题。
(2) 减少事务数据库的内容。DHP 算法生成的更小的候选集在生成2-项目集的时候,就可以通过使用剪技技术逐渐减少事务数据库的内容,包括减少整个数据库中事务的数量(即行数)和每个事务项中的个数(即每行包含的项目数量) ,从而显著地减少后面迭代的计算量。
(3) 减少数据库扫描,降低对磁盘的1/0 访问。经过剪枝,要处理的候选集小了,更多的内容可以在内存中进行,而且由于DHP 算法在每趟扫描数据库的时候没有得到项目集,这样可以节省某些数据库扫描.把频繁项目集的确定推迟到后一趟中,从而减少对磁盘1/0 的访问。
DHP 算法减少了处理的候选集,是以附加一个Hash 表的计算和数据库表的存储空间(为了进行数据库的修剪)为代价,换取执行时间的快速。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息