数据挖掘与数据仓库.docx
《数据挖掘与数据仓库.docx》由会员分享,可在线阅读,更多相关《数据挖掘与数据仓库.docx(13页珍藏版)》请在冰豆网上搜索。
![数据挖掘与数据仓库.docx](https://file1.bdocx.com/fileroot1/2023-2/4/ce393b1b-3fcf-490d-bb4a-41d473ee48f2/ce393b1b-3fcf-490d-bb4a-41d473ee48f21.gif)
数据挖掘与数据仓库
数据挖掘与数据仓库
指导老师:
学校:
班级:
学号:
姓名:
日期:
2013年6月15日
数据挖掘算法改进研究
目录
目录2
引言3
Apriori算法3
FP-growth算法4
Apriori算法的不足5
FP-growth算法的不足5
已有的提高Apriori算法效率的方法6
示例说明Apriori算法7
Apriori算法的改进8
FP-growth算法的改进11
引言数据的爆炸式增长、广泛可用和巨大数量使得我们时代成为真正的数据时代。
急需功能强大和通用的工具,以便从这些海量数据中发现有价值的信息,把这些数据转化成有组织的知识。
这种需求导致了数据挖掘的诞生。
这个领域是年青的、动态变化的、生机勃勃的。
数据挖掘已经并且将继续在我们从数据时代大步跨入信息时代的历程中做出贡献。
关联规则挖掘是数据挖掘研究的重要内容之一。
其中Apriori算法是一种最有影响的挖掘关联规则的算法。
其次还有FP-growth算法可以发现频繁模式而不产生候选,被广泛运用。
本文主要就这两个算法进行研究改进。
Apriori算法主要缺陷是由频繁k_项集进行自连接生成的候选频繁k_项集数量巨大和需要反复对数据库进行扫描。
本文分别提出了两种改进方法,重点在第一种。
FP-growth算法需要构造出数量巨大的条件FP-tree,不仅浪费时间且要占用大量的空间,挖掘效率偏低,且挖掘FP-tree过程包含递归,递归算法的效率也较低。
因此,为了提高算法效率,可以利用集合来进行FP-tree树挖掘的算法。
Apriori算法
最经典的关联规则挖掘算法是Apriori算法,它是由Agrawal和R.Srikant于1994提出的,为布尔关联规则挖掘频繁项集的原创性算法。
其基本思想是重复扫描数据库。
首先,通过扫描数据库,累计每个项的计数,找出频繁1项集的集合,该集合记作L1;然后L1用于找频繁2项集的集合L2,L2用于找L3;如此下去,直至找所有频繁K项集。
为了提高频繁项集逐层产生的效率,Apriori算法利用任意频繁项集的任意子集都是频繁集的性质,可以从长度为K的频繁迭代产生长度为K+1的候选集,再扫描数据库以验证其是否为频繁集。
但当数据库中事务较多、项目集较大时,Apriori算法在每次迭代产生大量的候选项集并统计候选项集的支持度需要消耗大量的时间,从而影响挖掘效率。
FP-growth算法
FP-growth算法采用分治策略,首先,将代表频繁项集的数据库压缩到一棵频繁模式树,该树仍保留项集的关联信息。
然后,把这种压缩后的数据库划分成一组条件数据库,每个数据库关联一个频繁项或“模式段”,并分别挖掘每个条件数据库。
对于每个“模式片段”,只需要考察与它相关联的数据集。
FP-Growth频繁项集挖掘算法的主要步骤:
第一步,构造FP树:
(1)扫描事务数据库DB,找出1-频繁项集,并根据它们的支持度计数按降序排序,结果一记为L。
(2)创建FP树的根节点,记为“null”,并置为当前树根。
(3)扫描DB中的一个事务T:
根据L选出T中的频繁项,并按L中的顺序排列,结果记为R。
(4)取出R中的第一个项I,检查当前树根,如果有一个子女N的项名与I相同,则N的计数加1,否则,创建一个新的节点N,将其计数记为1,并连接到当前树根(父节点),且根据项头表将其链接到具有相同项名的节点链的尾部。
如果R非空,将N置为当前树根,继续本步骤。
(5)将即树根“null”置为当前树根,继续(3),直到DB扫描完毕。
第二步,FP树的挖掘通过函数FP-Growth(FP-Tree,)来实现,第一次调用时“=null”。
Apriori算法的不足
Apriori作为经典的频繁项目集生成算法,在数据挖掘中具有里程碑的作用。
但是随着研究的深入,它的缺点也暴露出来。
Apriori算法有两个致命的性能瓶颈。
(1)由频繁k_项集进行自连接生成的候选频繁k_项集数量巨大。
例如,如果有104个1_频繁项集,则算法需要产生大约107个2_候选项集。
此外,为发现长度为100的频繁模式,如{x1,x2,…,x100},必须产生多达2100=1030个候选项集。
如此庞大的候选项集,在时间和空间上都是难以接受的。
(2)由于Apriori算法需要反复对数据库进行扫描,当存在长度较大的频繁集时会增加扫描数据库的次数,当数据库容量非常大的时候,又会增加每次扫描数据库的时间。
每产生一次候选项集都要扫描一次数据库。
为得到k_频繁项集,就需要扫描k次数据库,从而造成非常庞大的IO开销。
FP-growth算法的不足
FP-Growth方法将发现长频繁项集的问题转换成递归地搜索一些简短模式,然后链接较不频繁的后缀生成长频繁模式的问题,大大降低了搜索开销。
但FP-Growth算法还是存在缺陷:
(1)若涉及庞大的事务数据库,需要很大的空间来存放FP树
(2)挖掘FP树来产生频繁项集,需要为FP树中每个节点生成条件模式库和相应的条件模式树,若节点数量多,也必须占用很大的空间。
已有的提高Apriori算法效率的方法
(1)基于散列的技术
一种基于散列的技术可以用于压缩侯选k-项集Ck的(k≥2)集合的大小。
基本思想是:
当扫描事务数据库,由侯选k-项集的时候产生频繁k-项集,同时产生每个事务的(k+l)项子集,并把它们散列到散列表的不同桶中,增加桶的计数,在下次产生侯选(k+1)项集的时候,可以根据散列表和最小支持度排除一些无意义的侯选项集。
这种基于散列的技术可以显著地压缩需要考察的k项集。
它的关键是构造一个有效的散列函数。
(2)划分
使用划分的技术只需要对原事务数据库D进行两遍扫描的技术。
在第1遍,首先将事务数据库D划分成n个非重叠的部分,每个部分的最小支持度计数等于D的最小支持该部分的事务数之积。
对于每一部分,找出该部分的频繁项集,称作局部频繁项集。
局部频繁项集可能不是整个事务数据库的频繁项集,整个事务数据库的任何一个频繁项集必须作为局部频繁项集至少出现在一个部分中。
这样,把所有局部频繁项集的集合作为D的侯选项集,称作全局侯选项集。
再次扫描D,根据全局侯选项集和实际最小支持度确定全局频繁项集。
每一部分的大小和划分的数目由是否能够把该部分放入内存来确定。
(3)事务压缩
不包含任何频繁k项集的事务不可能包含任何(k+1)项集,从而我们可以将这些事务删除,因为在为产生(k+1)项集而扫描数据库的时候已经不再需要它们了。
(4)抽样
抽样方法的基本思想是在一个给定数据库D的随机样本S中进行挖掘,这种方法牺牲了精确性以换取有效性,样本S的大小由是否能够把它放入内存来确定。
样本S中的频繁项集不一定是数据库D中的频繁项集,而且,数据库D中的频繁项集不一定出现在样本S的频繁项集中,因此,应该使用比最小支持度低的支持度值来搜索样本S中的频繁项集,之后,通过数据库的其余部分再来计算每个项集的实际频繁度。
当效率是决定因素的时候,采样方法特别合适。
(4)动态项集计数
动态项集计数技术将数据库划分为标记开始点的块,在这种变形中算法可以在任何开始点添加新的侯选项集。
该技术动态地评估已被计数的所有项集的支持度,如果一个项集的所有子集己被确定为频繁的,则添加它作为新的侯选项集。
该算法对数据库的扫描次数比Apriori算法少。
示例说明Apriori算法
设事务数据库如表1所示,
为50%,
为70%,求事务数据库D中的频繁关联规则。
表1事务数据库表
项目集
1
ABCDE
2
ABC
3
CDEF
4
ABE
执行过程如下:
第一步:
求频繁项集
(1)频繁1-项集{{A},{B},{C},{D},{E}}。
(2)频繁2-项集{{AB},{AC},{AE},{BC},{BD},{CD},{CE}}。
(3)频繁3-项集{ABC}。
(4)综上
={{A},{B},{C},{D},{E},{AB},{AC},{AE},{BC},{BD},{CD},{CE},{ABC}}。
第二步:
求{ABC}关联关系
只有{AC}
{B},{BC}
{A},{A}
{B},{B}
{A}满足要求。
置信度都为100%。
Apriori算法的改进
(1)先介绍两个性质:
1、如果关联关系中存在A
,则
。
所以如果
<
,则
中任何子集所构成的关系均不满足最小置信度。
2、如果关联关系中存在A
,则A和B都是频繁项集,AB不一定是频繁项集。
下面进行算法改进。
第一步:
提出兴趣项的各个子集的项频数:
1 输入兴趣项和挖掘事务数据库;
2 扫描事务数据库;
3 记录各个子集的项频数和数据库中记录的总条数
,保存子集;
第二步:
找出关联关系
1 输入
和
,把
转化为
;
2 扫描保存的兴趣项子集,找出频繁项集,删除频数小于
的子集;
3 在频繁项集中,找出置信度大于
的关联关系,并输出。
改进算法伪代码
第一步:
找出兴趣项的各个子集的项频数
输入:
事务数据库D;兴趣项I
输出:
兴趣项I中的所有子集的频数和数据库的记录条数
Foreachcandidate
Do//遍历兴趣项的每一项
Count++
Endfor//记录兴趣项的项数
=
//找出兴趣项的所有子集
Foreachlog
Do//遍历数据库的每一条记录
Foreachcandidate
Do//遍历记录的每一项
if(
)//如果该项属于兴趣项
//找出该记录中的所有兴趣项
Endif
//该记录中兴趣项的所有子集的集合
Endfor
ForeachItemsin
//遍历该记录中兴趣项的所有子集的集合
//给该集合中的每一个元素加一
Endfor
Count++//记录数据库中记录的条数
Endfor
的伪代码如下:
)
Return
Endif
第二步:
中找出关联关系
输入:
最小支持度阈值
;最小置信度阈值
输出:
关联规则AR//返回符合要求的关联规则,和可信度
=Count*
*
Foreachcandidate
Do//遍历兴趣项的所有子集
DeleteI//如果I的频数小于
,则从
删除
Else
//如果I的频数大于
,则它为频繁项,保存在L中
Count1++//记录频繁项的个数
Endif
Endif
Endfor
Foreachcandidate
Do//遍历
的所有项
//遍历L中的每一元素
//如果
和
中的项都不相同
//如果
和
的项的并集在
中
,
Endif
Endif
Endfor
Endfor
算法复杂度分析:
m代表数据库中记录条数,一般很大,n代表用户感兴趣的项目数,一般为常数,比较小,复杂度为O(m*(
-1))。
(2)为改进上文所提到的算法第二个缺陷,可以使用一种产生候选项集的集合CK的新算法,使剪枝步的计算量减小以高算法效率
1 通过减少扫描数据库的次数改进I/O的性能。
2 改进产生频繁项集的计算性能。
3 寻找有效的并行关联规则算法。
4 引入抽样技术改进生成频繁项集的I/O的计算性能。
例如:
Park等人提出基于Hash的算法,用于有效地寻找频繁项集。
Savasere等人提出的基于划分的算法,将交易数据集划分为几个部分,每一个部分可以容纳于主存,每一部分独立地生成频繁项集。
这里没有进行深入设计实现该算法的方法步骤。
FP-growth算法的改进
尽管FP-growth算法的关联规则挖掘效率比Apriori算法高,但是它仍然需要扫描两次事务数据库。
在挖掘频繁模式的过程中,如果大项集的数量很多,并且如果由原数据库得到的FP-tree的分支很多,而且分支长度很长时,该算法需要构造出数量巨大的条件FP-tree,不仅浪费时间且要占用大量的空间,挖掘效率偏低,且挖掘FP-tree过程包含递归,递归算法的效率也较低。
因此,为了提高算法效率,可以利用集合来进行FP-tree树挖掘的算法。
FP-tree算法的工作原理:
第一构造FP-tree,第二挖掘FP-tree
(1)构造FP-tree
①扫描事务数据库D,获得D中所包含的全部频繁项F1及它们各自的支持度。
对F1中的频繁项按其支持度的降序排序。
结果为项目头表L。
②创建FP-tree的根节点T,以“null“标记。
再次扫描事务数据库。
对于D中每个事务Trans,创建Trans中的频繁项,并按F1中的次序排序。
设排序后的频繁项表为[p|P],其中p是第一个频繁项,而P是剩余的频繁项。
调用insert-tree([p|P],T)。
insert-tree([p|P],T)过程执行情况如下:
如果T有子女N使得N.item-name=p.item.name,则N的计数值增加1;否则创建一个新节点N,将其计数设置为1,链接到它的父节点T,并且通过节点链结构将其链接到具有相同item-name的节点。
如果P非空,递归调用insert-tree(P,N)。
在事务数据库再次扫描完毕后,一个完全的FP-tree就建立了。
(2)挖掘FP-tree
从项头表L中的最后一项开始,根据节点链得到其分枝,若有多个分枝,逐一分开考虑,对每个分枝,做如下处理:
取得该节点到根节点null的路径,对该路径上所有节点进行组合(根节点null除外),并设置各组合的计数值。
然后将所有的组合送入候选频繁模式集合CF,若CF中已经存在相同的组合(即组合的标识符号相同),则进行合并。
合并操作为:
组合标识保持不变,计数值为二者之和。
该路径上所有的组合进入候选频繁模式集CF后,对该路径上的节点进行修正。
修正过程为:
使该路径上的所有节点的count值减去当前考虑节点的count值。
此后,再取L表中的上一项,重复上述过程直到表中的所有项都被考虑完毕,或者相应考虑的节点的计数值count=0,此时完成整棵树的挖掘处理。
最后用给出的min_sup值(最小支持度)剔除CF中计数值小于min_sup的组合。
这样,留在CF中的就是所要找的频繁模式,依此可构造出所有的候选关联规则,并可用给出的min_suf值(最小置信度)筛选出所需要的关联规则。
参考书籍
(1)数据挖掘概念与技术(原书第三版)机械工业出版社
(2)网上相关数据挖掘资料