数据挖掘(2):关联规则FpGrowth算法课案_第1页
数据挖掘(2):关联规则FpGrowth算法课案_第2页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据挖掘(2):关联规则FpGrowth算法2015/08/28IT技术数据挖掘分享到:6Android-精通Activity新春特辑-Cocos抢红包Android攻城狮的第二门课(第3季)Android攻城狮的第二门课(第2季)原文出处:fengfenggirl(也爱数据挖掘)上一篇介绍了关联规则挖掘的一些基本概念和经典的Apriori算法,Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。今天我们介绍一个新的算法挖掘频繁项集,效率比Ap

2、rori算法高很多。FpGrowth算法通过构造一个树结构来压缩数据记录,吏得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。我们还是以上一篇中用的数据集为例:TIDT1T2T3T4T5Items牛奶,面包面包,尿布,啤酒,鸡蛋牛奶,尿布,啤酒,可乐面包,牛奶,尿布,啤酒面包,牛奶,尿布,可乐、构造FpTreeFpTree是一种树结构,树结构定义如下:publicclassFpNode23 StringidName;/id号4 List<FpNode>children;/孩子结点5 FpNodeparent;/父结点6 FpNodenext;/下

3、一个id号相同的结点7 longcount;/出现次数树的每一个结点代表一个项,这里我们先不着急看树的结构,我们演示一下FpTree的构造过程,FpTree构造好后自然明白了树的结构。假设我们的最小绝对支持度是3。Step1:扫描数据记录,生成一级频繁项集,并按出现次数由多到少排序,如下所示:Item牛奶面包尿布啤酒可以看到,鸡蛋和可乐没有出现在上表中Count4443因为可乐只出现2次,鸡蛋只出现1次,小于最小支持度,因此不是频繁项集,根据Apriori定理,非频繁项集的超集一定不是频繁项集,所以可乐和鸡蛋不需要再考虑。Step2:再次扫描数据记录,对每条记录中出现在Step1产生的表中的项

4、,按表中的顺序排序。初始时,新建一个根结点,标记为null;1)第一条记录:牛奶,面包,按Step1表过滤排序得到依然为牛奶,面包,新建一个结点,idName为件奶,将其插入到根节点下,并设置count为1,然后新建一个(面包结点,插入到牛奶结点下面,插入后如下所示:2 )第二条记录:面包,尿布,啤酒,鸡蛋,过滤并排序后为:面包,尿布,啤酒,发现根结点没有包含面包的儿子(有一个面包孙子但不是儿子),因此新建一个面包结点,插在根结点下面,这样根结点就有了两个孩子,随后新建尿布结点插在面包结点下面,新建啤酒结点插在尿布下面,插入后如下所示:匚ount:lcount:lcount:-l牛奶null面

5、包count:lcount:l尿布啤酒3 )第三条记录:牛奶,尿布,啤酒,可乐,过滤并排序后为:牛奶,尿布,啤酒,这时候发现根结点有儿子牛奶,因此不需要新建结点,只需将原来的牛奶结点的count加1即可,往下发现件奶结点有一个儿子尿布,于是新建尿布结点,并插入到件奶结点下面,随后新建啤酒结点插入到尿布结点后面。插入后如下图所示:4 )第四条记录:面包,牛奶,尿布,啤酒,过滤并排序后为:牛奶,面包尿布,啤酒,这时候发现根结点有儿子牛奶,因此不需要新建结点,只需将原来的牛奶结点的count加1即可,往下发现牛奶结点有一个儿子面包,于是也不需要新建面包结点,只需将原来面包结点的count加1,由于这

6、个面包结点没有儿子,此时需新建尿布结点,插在面包结点下面,随后新建啤酒结点,插在尿布结点下面,插入后如下图所示:5 )第五条记录:面包,牛奶,尿布,可乐,过滤并排序后为:牛奶,面包,尿布,检查发现根结点有牛奶儿子,牛奶结点有面包儿子,面包结点有尿布儿子,本次插入不需要新建结点只需更新count即可,示意图如下:按照上面的步骤,我们已经基本构造了一棵FpTree(FrequentPatternTree),树中每天路径代表一个项集,因为许多项集有公共项,而且出现次数越多的项越可能是公公项,因此按出现次数由多至U少的顺序可以节省空间,实现压缩存储,另夕卜我们需要一个表头和对每一个idName相同的结

7、点做一个线索,方便后面使用,线索的构造也是在建树过程形成的,但为了简化FpTree的生成过程,我没有在上面提到,这个在代码有体现的,添加线索和表头的Fptree如下:ccKjnt:4-牛潮Eount:»l面包cauntiBcount:!count:!匚口untzi屁布牛奶面包尿布啤酒rountzlcounts匚ounLl至此,整个FpTree就构造好了,在下面的挖掘过程中我们会看到表头和线索的作用。二利用FpTree挖掘频繁项集FpTree建好后,就可以进行频繁项集的挖掘,挖掘算法称为FpGrowth(FrequentPatternGrowth)算法,挖掘从表头header的最后一个

8、项开始。1)此处即从啤酒开始,根据啤酒的线索链找到所有啤酒结点,然后找出每个啤酒结点的分支:牛奶,面包,尿布,啤酒:1,牛奶,尿布,啤酒:1,面包,尿布,啤酒1,其中的T表示出现1次,注意,虽然牛奶出现4次,但牛奶,面包,尿布,啤酒只同时出现1次因此分支的count是由后缀结点啤酒的count决定的除去啤酒,我们得到对应的前缀路径件奶,面包,尿布:1,件奶,尿布:1,面包,尿布:1,根据前缀路径我们可以生成一颗条件FpTree,构造方式跟之前一样,此处的数据记录变为:TIDItemsT1牛奶,面包,尿布T2牛奶,尿布T3面包,尿布绝对支持度依然是3,构造得到的FpTree为:构造好条件树后,对

9、条件树进行递归挖掘,当条件树只有一条路径时,路径的所有组合即为条件频繁集,假设啤酒的条件频繁集为S1,S2,S3,则啤酒的频繁集为S1+啤酒,S2+啤酒,S3+啤酒,即啤酒的频繁集一定有相同的后缀啤酒,此处的条件频繁集为:,尿布,于是啤酒的频繁集为啤酒尿布,啤酒。2)接下来找header表头的倒数第二个项尿布的频繁集,同上可以得到尿布的前缀路径为:面包:1,牛奶:1,件奶,面包:2,条件FpTree的数据集为:TIDItemsT1面包T2牛奶T3牛奶,面包T4牛奶,面包注意牛奶,面包:2,即牛奶,面包的count为2,所以在牛奶,面包重复了两次,这样做的目的是可以利用之前构造FpTree的算法

10、来构造条件Fptree,不过这样效率会降低,试想如果件奶,面包的count为20000,那么就需要展开成20000条记录,然后进行20000次count更新,而事实上只需要对count更新一次到20000即可。这是实现上的优化细节,实践中当注意。构造的条件FpTree为:这颗条件树已经是单一路径,路径上的所有组合即为条件频繁集:,牛奶,面包,牛奶,面包,加上尿布后,又得到一组频繁项集尿布,牛奶,尿布,面包,尿布,牛奶,面包,尿布,这组频繁项集一定包含一个相同的后缀:尿布,并且不包含啤酒,因此这一组频繁项集与上一组不会重复。重复以上步骤,对header表头的每个项进行挖掘,即可得到整个频繁项集,可以证明(严谨的算法和证明可见参考文献1),频繁项集即不重复也不遗漏。程序的实现代码还是放在我的github上,这里看一下运行结果:绝对支持度:3频繁项集:面包尿布3尿布牛奶3牛奶4面包牛奶3尿布啤酒3面包4另外我下载了一个购物篮的数据集,数据量较大,则试了一下FpGrowth的效率还是不错的。FpGrowth算法的平均效

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论