ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:170.85KB ,
资源ID:16548188      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16548188.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据挖掘2关联规则FpGrowth算法文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据挖掘2关联规则FpGrowth算法文档格式.docx

1、 Android攻城狮的第二门课(第2季)原文出处:fengfenggirl(也爱数据挖掘)上一篇介绍了关联规则挖掘的一些基本概念和经典的Apriori算法,Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。今天我们介绍一个新的算法挖掘频繁项集,效率比Aprori算法高很多。FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。我们还是以上一篇中用的数据集

2、为例:TIDItemsT1牛奶,面包T2面包,尿布,啤酒,鸡蛋T3牛奶,尿布,啤酒,可乐T4面包,牛奶,尿布,啤酒T5面包,牛奶,尿布,可乐一、构造FpTreeFpTree是一种树结构,树结构定义如下:1234578public class FpNode String idName;/ id号List children;/ 孩子结点FpNode parent;/ 父结点FpNode next;/ 下一个id号相同的结点long count;/ 出现次数树的每一个结点代表一个项,这里我们先不着急看树的结构,我们演示一下FpTree的构造过程,FpTree构造好后自然明白了树的结构。假设我们的最小

3、绝对支持度是3。Step 1:扫描数据记录,生成一级频繁项集,并按出现次数由多到少排序,如下所示:ItemCount牛奶面包尿布啤酒可以看到,鸡蛋和可乐没有出现在上表中,因为可乐只出现2次,鸡蛋只出现1次,小于最小支持度,因此不是频繁项集,根据Apriori定理,非频繁项集的超集一定不是频繁项集,所以可乐和鸡蛋不需要再考虑。Step 2:再次扫描数据记录,对每条记录中出现在Step 1产生的表中的项,按表中的顺序排序。初始时,新建一个根结点,标记为null;1)第一条记录:牛奶,面包,按Step 1表过滤排序得到依然为牛奶,面包,新建一个结点,idName为牛奶,将其插入到根节点下,并设置co

4、unt为1,然后新建一个面包结点,插入到牛奶结点下面,插入后如下所示:2)第二条记录:面包,尿布,啤酒,鸡蛋,过滤并排序后为:面包,尿布,啤酒,发现根结点没有包含面包的儿子(有一个面包孙子但不是儿子),因此新建一个面包结点,插在根结点下面,这样根结点就有了两个孩子,随后新建尿布结点插在面包结点下面,新建啤酒结点插在尿布下面,插入后如下所示:3)第三条记录:牛奶,尿布,啤酒,可乐,过滤并排序后为:牛奶,尿布,啤酒,这时候发现根结点有儿子牛奶,因此不需要新建结点,只需将原来的牛奶结点的count加1即可,往下发现牛奶结点有一个儿子尿布,于是新建尿布结点,并插入到牛奶结点下面,随后新建啤酒结点插入到

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

6、示意图如下:按照上面的步骤,我们已经基本构造了一棵FpTree(Frequent Pattern Tree),树中每天路径代表一个项集,因为许多项集有公共项,而且出现次数越多的项越可能是公公项,因此按出现次数由多到少的顺序可以节省空间,实现压缩存储,另外我们需要一个表头和对每一个idName相同的结点做一个线索,方便后面使用,线索的构造也是在建树过程形成的,但为了简化FpTree的生成过程,我没有在上面提到,这个在代码有体现的,添加线索和表头的Fptree如下:至此,整个FpTree就构造好了,在下面的挖掘过程中我们会看到表头和线索的作用。二、利用FpTree挖掘频繁项集FpTree建好后,就

7、可以进行频繁项集的挖掘,挖掘算法称为FpGrowth(Frequent Pattern Growth)算法,挖掘从表头header的最后一个项开始。1)此处即从啤酒开始,根据啤酒的线索链找到所有啤酒结点,然后找出每个啤酒结点的分支:牛奶,面包,尿布,啤酒:1,牛奶,尿布,啤酒:1,面包,尿布,啤酒:1,其中的“1”表示出现1次,注意,虽然牛奶出现4次,但牛奶,面包,尿布,啤酒只同时出现1次,因此分支的count是由后缀结点啤酒的count决定的,除去啤酒,我们得到对应的前缀路径牛奶,面包,尿布:1,牛奶,尿布:1,面包,尿布:1,根据前缀路径我们可以生成一颗条件FpTree,构造方式跟之前一样

8、,此处的数据记录变为:牛奶,面包,尿布牛奶,尿布面包,尿布绝对支持度依然是3,构造得到的FpTree为:构造好条件树后,对条件树进行递归挖掘,当条件树只有一条路径时,路径的所有组合即为条件频繁集,假设啤酒的条件频繁集为S1,S2,S3,则啤酒的频繁集为S1+啤酒,S2+啤酒,S3+啤酒,即啤酒的频繁集一定有相同的后缀啤酒,此处的条件频繁集为:,尿布,于是啤酒的频繁集为啤酒尿布,啤酒。2)接下来找header表头的倒数第二个项尿布的频繁集,同上可以得到尿布的前缀路径为:面包:1,牛奶:1,牛奶,面包:2,条件FpTree的数据集为:面包牛奶牛奶,面包注意牛奶,面包:2,即牛奶,面包的count为

9、2,所以在牛奶,面包重复了两次,这样做的目的是可以利用之前构造FpTree的算法来构造条件Fptree,不过这样效率会降低,试想如果牛奶,面包的count为20000,那么就需要展开成20000条记录,然后进行20000次count更新,而事实上只需要对count更新一次到20000即可。这是实现上的优化细节,实践中当注意。构造的条件FpTree为:这颗条件树已经是单一路径,路径上的所有组合即为条件频繁集:,牛奶,面包,牛奶,面包,加上尿布后,又得到一组频繁项集尿布,牛奶,尿布,面包,尿布,牛奶,面包,尿布,这组频繁项集一定包含一个相同的后缀:尿布,并且不包含啤酒,因此这一组频繁项集与上一组不

10、会重复。重复以上步骤,对header表头的每个项进行挖掘,即可得到整个频繁项集,可以证明(严谨的算法和证明可见参考文献1),频繁项集即不重复也不遗漏。程序的实现代码还是放在我的github上,这里看一下运行结果:绝对支持度: 3频繁项集: 面包 尿布尿布 牛奶牛奶 4面包 牛奶尿布 啤酒面包另外我下载了一个购物篮的数据集,数据量较大,测试了一下FpGrowth的效率还是不错的。FpGrowth算法的平均效率远高于Apriori算法,但是它并不能保证高效率,它的效率依赖于数据集,当数据集中的频繁项集的没有公共项时,所有的项集都挂在根结点上,不能实现压缩存储,而且Fptree还需要其他的开销,需要存储空间更大,使用FpGrowth算法前,对数据分析一下,看是否适合用FpGrowth算法。下一篇将介绍,关联规则的评价标准,欢迎持续关注。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1