数据挖掘系列(2)--关联规则FpGrowth算法

关联规则挖掘算法Aprior和FPGrowth对比与改进 Aprior算法和FPGrowth算法同属于关联规则挖掘算法,但Aprior是基于广度优先的,而FPGrowth是基于深度优先的,即Aprior算法需要建立K项集,然后扫描数据库;而FPGrowth算法则是扫描数据库,然后查找频繁项集。Aprior算法Aprior算法的原理和实现参见http://blog.youkuaiyun.com/olaking/article/details/42810865和http: 阅读详情

上一篇介绍了关联规则挖掘的一些基本概念和经典的Apriori算法,Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。今天我们介绍一个新的算法挖掘频繁项集,效率比Aprori算法高很多。

  FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。我们还是以上一篇中用的数据集为例: 

TID Items
T1 {牛奶,面包}
T2 {面包,尿布,啤酒,鸡蛋}
T3 {牛奶,尿布,啤酒,可乐}
T4 {面包,牛奶,尿布,啤酒}
T5 {面包,牛奶,尿布,可乐}

一、构造FpTree

  FpTree是一种树结构,树结构定义如下: 

复制代码
public class FpNode {

    String idName;// id号
    List<FpNode> children;// 孩子结点
    FpNode parent;// 父结点
    FpNode next;// 下一个id号相同的结点
    long count;// 出现次数
} 
复制代码

  树的每一个结点代表一个项,这里我们先不着急看树的结构,我们演示一下FpTree的构造过程,FpTree构造好后自然明白了树的结构。假设我们的最小绝对支持度是3。

  Step 1:扫描数据记录,生成一级频繁项集,并按出现次数由多到少排序,如下所示: 

Item Count
牛奶 4
面包 4
尿布 4
啤酒 3

  可以看到,鸡蛋和可乐没有出现在上表中,因为可乐只出现2次,鸡蛋只出现1次,小于最小支持度,因此不是频繁项集,根据Apriori定理,非频繁项集的超集一定不是频繁项集,所以可乐和鸡蛋不需要再考虑。

  Step 2:再次扫描数据记录,对每条记录中出现在Step 1产生的表中的项,按表中的顺序排序。初始时,新建一个根结点,标记为null;

  1)第一条记录:{牛奶,面包},按Step 1表过滤排序得到依然为{牛奶,面包},新建一个结点,idName为{牛奶},将其插入到根节点下,并设置count为1,然后新建一个{面包}结点,插入到{牛奶}结点下面,插入后如下所示:

  2)第二条记录:{面包,尿布,啤酒,鸡蛋},过滤并排序后为:{面包,尿布,啤酒},发现根结点没有包含{面包}的儿子(有一个{面包}孙子但不是儿子),因此新建一个{面包}结点,插在根结点下面,这样根结点就有了两个孩子,随后新建{尿布}结点插在{面包}结点下面,新建{啤酒}结点插在{尿布}下面,插入后如下所示:

 

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

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

  

 

  5)第五条记录:{面包,牛奶,尿布,可乐},过滤并排序后为:{牛奶,面包,尿布},检查发现根结点有{牛奶}儿子,{牛奶}结点有{面包}儿子,{面包}结点有{尿布}儿子,本次插入不需要新建结点只需更新count即可,示意图如下:

  

 

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

  至此,整个FpTree就构造好了,在下面的挖掘过程中我们会看到表头和线索的作用。

二、利用FpTree挖掘频繁项集

   FpTree建好后,就可以进行频繁项集的挖掘,挖掘算法称为FpGrowth(Frequent Pattern Growth)算法,挖掘从表头header的最后一个项开始。

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

TID Items
T1 {牛奶,面包,尿布}
T2 {牛奶,尿布}
T3 {面包,尿布}

  绝对支持度依然是3,构造得到的FpTree为:

构造好条件树后,对条件树进行递归挖掘,当条件树只有一条路径时,路径的所有组合即为条件频繁集,假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},即{啤酒}的频繁集一定有相同的后缀{啤酒},此处的条件频繁集为:{{},{尿布}},于是{啤酒}的频繁集为{{啤酒}{尿布,啤酒}}。

  2)接下来找header表头的倒数第二个项{尿布}的频繁集,同上可以得到{尿布}的前缀路径为:{面包:1},{牛奶:1},{牛奶,面包:2},条件FpTree的数据集为:

TID Items
T1 {面包}
T2 {牛奶}
T3 {牛奶,面包}
T4 {牛奶,面包}

  注意{牛奶,面包:2},即{牛奶,面包}的count为2,所以在{牛奶,面包}重复了两次,这样做的目的是可以利用之前构造FpTree的算法来构造条件Fptree,不过这样效率会降低,试想如果{牛奶,面包}的count为20000,那么就需要展开成20000条记录,然后进行20000次count更新,而事实上只需要对count更新一次到20000即可。这是实现上的优化细节,实践中当注意。构造的条件FpTree为:


   这颗条件树已经是单一路径,路径上的所有组合即为条件频繁集:{{},{牛奶},{面包},{牛奶,面包}},加上{尿布}后,又得到一组频繁项集{{尿布},{牛奶,尿布},{面包,尿布},{牛奶,面包,尿布}},这组频繁项集一定包含一个相同的后缀:{尿布},并且不包含{啤酒},因此这一组频繁项集与上一组不会重复。

  重复以上步骤,对header表头的每个项进行挖掘,即可得到整个频繁项集,可以证明(严谨的算法和证明可见参考文献[1]),频繁项集即不重复也不遗漏。

  程序的实现代码还是放在我的github上,这里看一下运行结果:

复制代码
绝对支持度: 3
频繁项集: 
面包 尿布     3
尿布 牛奶     3
牛奶     4
面包 牛奶     3
尿布 啤酒     3
面包     4
复制代码

 

  另外我下载了一个购物篮的数据集,数据量较大,测试了一下FpGrowth的效率还是不错的。FpGrowth算法的平均效率远高于Apriori算法,但是它并不能保证高效率,它的效率依赖于数据集,当数据集中的频繁项集的没有公共项时,所有的项集都挂在根结点上,不能实现压缩存储,而且Fptree还需要其他的开销,需要存储空间更大,使用FpGrowth算法前,对数据分析一下,看是否适合用FpGrowth算法。

  下一篇将介绍,关联规则的评价标准,欢迎持续关注。

 参考文献:

  [1].Han jia wei, Pei Jan等 Mining Frequent Patterns without Candidate Generation: A Frequent-Pattern Tree Approach.2004

转载请注明出处:http://www.cnblogs.com/fengfenggirl

Java实现Apriori算法进行关联规则挖掘 实验描述: 对指定数据集进行关联规则挖掘,选择适当的挖掘算法,编写程序实现,提交程序和结果报告。 数据集: retail.txt ,根据数据集中的数据利用合适的挖掘算法得到频繁项集,并计算置信度,求出满足置信度的所有的关联规则 retail.txt中每个数字表示一种商品的ID,一个{}内的表示一次交易 实验环境和编程语言: 本实验使用的编程语言为:Java 编程环境为:Intellij 阅读详情

相关推荐

fpgrowth算法实战 mlib_Spark MLlib FPGrowth关联规则算法

一.简介FPGrowth算法是关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息。在算法中使用了一种称为频繁模式树(Frequent Pattern Tree)的数据结构。FP-tree是一种特殊的前缀树,由频繁项头表和项前缀树构成。相关术语:1.项与项集这是一个集合的概念,以购物车为例,一件商品就是一项【item】,若干项的集合为...

weixin_42364392的博客 427

关联规则 FP-Growth算法

FP-growth算法是Apriori算法的改进,该算法大大提高了频繁模式的效率,一起来学习吧 。

2201_75381449的博客 971

FPgrowth算法:高效的关联规则挖掘

FP-growth算法:高效的关联规则挖掘 作者:禅与计算机程序设计艺术 1. 背景介绍 关联规则挖掘是数据挖掘领域中一项重要的任务,它旨在从大量的事务数据中发现有价值的项目关联模式。其中,Apriori算法是最为经典和广泛应用的关联规则挖掘算法之一。然而,Aprio

AI天才研究院 1157

关联规则算法——FP-Growth算法

项集:数据库中的数据项构成的非空集合事务:一个事务包含了一个或多个项集支持度:包含项集x的事务数量与全部事务数量的百分比置信度:同时包含数据项x和数据项y的事务数量与事务x(或事务y)出现的次数之比最小支持度与最小置信度:关联规则必须满足的最低要求,由用户设定频繁项集:大于等于最小支持度的项集称为频繁项集最大频繁项集:不被其它频繁项集包含的频繁项集称为最大频繁项集强关联规则:大于等于最小支持度和最小置信度称为强关联规则(频繁项集的基础上大于等于最小置信度)FP-Growth不会产生候选项集,它采用分而治之的

w20001118的博客 2692

关联规则fpgrowthc、c#和matlab算法附讲解文档

FP-tree是一个数据库里跟产生频繁集有关的信息的压缩表示。该实现基于Windows平台,编程工具是Visual C++ 6.0,许多地方还用到了C++的标准模板库。另外还附带c#和matlab版本

基于FP-Growth算法的关联规则挖掘

基于python语言实现FP-Growth算法,并通过实例实现其对销售订单的关联规则进行挖掘。 资料包括完整的源码文件。 实现方式: 要实现购物篮分析,其实有很多种方法,上面的几种考核指标都很清晰了,我们使用SQL也是可以统计的,只不过有点儿麻烦,需要手动做一个商品的组合,或者使用商品间笛卡尔积作为基础表,但是这还得看组合数量,如果只组合2种还好,组合3种、4种呢? 再就是使用Python或者R来做了,可以选择自己代码实现,也可以使用现有的开源包,我们只要用就行了,这里我也是直接使用了Python中的mlxtend拓展包。 数据处理: 这里把数据处理单独拎出来说一下,做关联分析,需要注意下数据的选取,比如有些行业需要考虑场景,如早中晚这种,每种场景下用户购物偏好不一样,每种场景都有适合的商品组合; 再比如最近的打折促销的商品要剔除掉,因为要走量,所以可能很多订单都有这件商品,会影响我们的最后结论; 还有就是一些附赠品,试用品,新人优惠的商品,都是会影响我们结论的一些数据。

数据挖掘-深入解析FP-Growth算法

数据挖掘作为一门重要的计算机科学领域,旨在从大规模数据集中发现隐藏的模式、关联以及有价值的信息。FP-Growth算法作为一种优秀的关联规则挖掘算法,通过构建紧凑的数据结构和高效的处理方式,能够在大数据集上高效挖掘频繁项集,本文将深入解析FP-Growth算法的原理和优势,并介绍其在实际应用中的案例。数据挖掘是从大量数据中自动发现模式、关联和信息的过程。它涉及多个领域,如机器学习、统计学、数据库系统等。数据挖掘的主要目标是从数据集中提取有用的知识,这些知识可以用于预测未来趋势、做出决策或优化业务流程。

m0_61789994的博客 5681

Python实战:基于PyG和Stable-Baselines3复现柔性车间调度算法(附数据集)

本文提供了一份基于图神经网络与深度强化学习的柔性车间调度实战指南。通过PyTorch Geometric构建异构图表示车间状态,并利用Stable-Baselines3中的PPO算法训练调度智能体,详细介绍了从环境建模、网络设计到训练评估的完整代码实现,帮助开发者构建可复用的工业级智能调度系统。

ansible6ops的博客 608

关联规则挖掘之FPGrowth算法实现

1 关联规则挖掘之FPGrowth算法实现 Apriori算法通过利用频繁集的两个特性,过滤了很多无效集合,提高了算法效率。但是算法每一次对频繁项集的筛选都需要扫描一次原始数据集,对于大规模数据集Apriori的算法效率不尽如人意。 FPGrowth算法由韩家炜[1]等人于2000年提出,其中FPTree是使得这一算法相比Apriori等算法较为高效的关键数据结构,FPTree将数据库中的所有事务(Transactions)高度压缩成树的路径,所有的频繁项(Frequent Items, FIs)都成为树

行者的博客 5532

别再乱改宏定义了!STM32F103程序移植保姆级教程(从C8T6到ZET6实战)

本文详细解析了STM32F103程序从C8T6移植到ZET6的实战步骤,重点介绍了硬件差异、开发环境配置、时钟陷阱及外设处理等关键点。通过修改宏定义(如STM32F10X_HD)、调整启动文件和时钟配置,确保移植顺利进行。适合嵌入式开发者参考,避免常见移植问题。

weixin_42567497的博客 215

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

Spark MLlib FPGrowth关联规则算法实现

Spark MLlib FPGrowth关联规则算法实现一、基本概念1、项与项集2、关联规则3、支持度4、置信度5、提升度二、FPGrowth算法1、构造FP树2、FP树的挖掘三、训练数据四、实战代码五、运行结果 一、基本概念 1、项与项集 这是一个集合概念,在一个篮子商品中的一件消费品即一项(iten),若干项的集合为项集,如{啤酒,尿布}构成一个二元项集。 2、关联规则 关联规则用于表示数据内...

Running_Tiger的博客 1960

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 390

数据挖掘关联规则挖掘之FpGrowth算法

数据挖掘关联规则挖掘之FpGrowth算法

u013373155的博客 1376

.NET 8 组件之IOC容器组件

NET 8中的IOC容器组件继承了前几代的优良传统,并在性能、扩展性、灵活性等方面进行了诸多优化,使得它在现代应用开发中依然保持领先地位。通过合理使用IOC容器,开发者可以更高效地管理依赖关系,编写更加模块化、可维护的代码。随着.NET生态的不断发展,IOC容器将继续扮演关键角色,为开发者提供强大的依赖管理功能。

hy_4377的博客 1529

PS/Ai/PR/AE等adobe出现正版弹窗提示:Your non-genuine Adobe app will be disabled soon解决办法

就是用专门的清理工具下载,清理工具在文章下方。然后新建三个空的记事本文件,重命名为 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。在该文件目录中,分别找到 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe,然后在防火墙入站规则里,阻止Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。

Q82556499的博客 1万+

简单详细叙述FpGrowth算法思想(附python源码实现)

关联规则--FpGrowth算法思想及编程实现构建FpTree 本文为博主原创文章,转载请注明出处,并附上原文链接。 原文链接: FpGrowth算法,全称:Frequent Pattern Growth—-频繁模式增长,该算法是Apriori算法的改进版本(若是不会这个算法或是有点遗忘了,可以移步到我的这篇博客),我们知道Apriori算法为了产生频繁模式项集,需要对数据库多次扫描,当数据库内容太大,那么算法运行的时间是难以忍受的,因此有人提出了FpGrowth算法,只须扫描数据库两次即可求出频繁项集,大

A little storm的博客 1万+

CloudCompare 多窗口联动显示点云

CloudCompare支持多窗口联动显示多个点云数据,可以用来比对原始点云数据与语义分割后的结果。 一、创建多个视窗 打开CloudCompare后会默认有一个视图,我们要同时打开两个数据就需要再创建一个视图,选择菜单栏里的3D Views,在下拉菜单中点击new,这样就创建了一个新的视图,这时3D Views的下拉菜单中有3D View 1和3D View 2两个视图,然后点击3D Views下拉菜单中的Title,这时在数据展示区就会出现两个并列的窗口。 二、分别加载点云数据 将数据分别拖进两个

zhaoguanhua的博客 2740

数据挖掘2.4——关联规则挖掘 知识点整理

1.基本概念1.1定义 2.频繁项挖掘算法2.1降低产生频繁顷集计算复杂度的算法2.2 Apriori2.3 FPGrowth2.4 产生关联规则 3.关联分析的评估

定期分享我的发现和想法,感谢你的陪伴和支持 8252

基于 Qt C++ 的 船舶导航系统 UI

你想实现一个基于 **Qt C++** 的 **船舶导航系统 UI**,核心功能包括 **Qt Quick** 电子海图显示和 **NMEA 0183** 协议解析。"断开" : "连接"创建一个 Qt Quick 项目,选择 **Qt 6** 版本,确保勾选 **Qt Quick**、**Qt Network** 和 **Qt SQL** 模块。Label { text: "纬度:" }3. **连接设备**:点击 "连接" 按钮连接到 GPS 设备或模拟数据源。title: "连接设置"

寒寒豆豆软件公司的博客 127

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
下一篇: 数据挖掘系列(3)--关联规则评价
youbo_sun
博客等级 码龄12年 20粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值