1. 提出问题

对于Apriror算法来说,仍然受到两种非平凡开销的影响:

  • 仍然需要产生大量的候选集。例如,如果有10^4个频繁1项集,则需要产生10^7个候选频繁2项集。

  • 可能需要重复地扫描整个数据库。检索数据库中每个事务来确定候选项集支持度的开销会很大。

所以,我们需要设计一种方法,挖掘全部频繁项集而无须这种代价昂贵的候选产生过程。即,不需要产生如此大量的候选集,同时在确定候选集支持度时不需要重复地扫描整个数据库。

这里试图解决这种问题的方法称为频繁模式增长(Frequent-Pattern Growth, FP-growth)

2. FP-growth

总的来说,就是在不生成候选项的情况下,完成Apriori算法的功能。

FPTree算法的基本数据结构,包含一个一棵FP树和一个项头表,每个项通过一个结点链指向它在树中出现的位置。基本结构如下所示。需要注意的是项头表需要按照支持度递减排序,在FPTree中高支持度的节点只能是低支持度节点的祖先节点。

另外还要交代一下FPTree算法中几个基本的概念:

  • FP-Tree:就是上面的那棵树,是把事务数据表中的各个事务数据项按照支持度排序后,把每个事务中的数据项按降序依次插入到一棵以NULL为根结点的树中,同时在每个结点处记录该结点出现的支持度。

  • 条件模式基:包含FP-Tree中与后缀模式一起出现的前缀路径的集合。也就是同一个频繁项在PF树中的所有节点的祖先路径的集合。比如I3在FP树中一共出现了3次,其祖先路径分别是{I2,I1:2(频度为2)},{I2:2}和{I1:2}。这3个祖先路径的集合就是频繁项I3的条件模式基。

  • 条件树:将条件模式基按照FP-Tree的构造原则形成的一个新的FP-Tree。比如上图中I3的条件树就是:

算法的具体步骤:

Step 1)构造项头表:扫描数据库一遍,得到频繁项的集合F和每个频繁项的支持度。把F按支持度递降排序,记为L。

Step 2)构造原始FPTree:把数据库中每个事物的频繁项按照L中的顺序进行重排。并按照重排之后的顺序把每个事物的每个频繁项插入以null为根的FPTree中。如果插入时频繁项节点已经存在了,则把该频繁项节点支持度加1;如果该节点不存在,则创建支持度为1的节点,并把该节点链接到项头表中。

Step 3)调用FP-growth(Tree,null)开始进行挖掘。伪代码如下:

procedure FP_growth(Tree, a)
if Tree 含单个路径P then{for 路径P中结点的每个组合(记作b)产生模式b U a,其支持度support = b 中结点的最小支持度;
} else {for each a i 在Tree的头部(按照支持度由低到高顺序进行扫描){产生一个模式b = a i U a,其支持度support = a i .support;构造b的条件模式基,然后构造b的条件FP-树Treeb;if Treeb 不为空 then调用 FP_growth (Treeb, b);}
}

FP-growth是整个算法的核心,再多啰嗦几句。

FP-growth函数的输入:tree是指原始的FPTree或者是某个模式的条件FPTree,a是指模式的后缀(在第一次调用时a=NULL,在之后的递归调用中a是模式后缀)

FP-growth函数的输出:在递归调用过程中输出所有的模式及其支持度(比如{I1,I2,I3}的支持度为2)。每一次调用FP_growth输出结果的模式中一定包含FP_growth函数输入的模式后缀。

我们来模拟一下FP-growth的执行过程。

  1. 在FP-growth递归调用的第一层,模式前后a=NULL,得到的其实就是频繁1-项集。

  2. 对每一个频繁1-项,进行递归调用FP-growth()获得多元频繁项集。

两个例子来说明:

(1)

I5的条件模式基是(I2 I1:1), (I2 I1 I3:1),I5构造得到的条件FP-树如下。然后递归调用FP-growth,模式后缀为I5。

这个条件FP-树是单路径的,在FP_growth中直接列举{I2:2,I1:2,I3:1}的所有组合,之后和模式后缀I5取并集得到支持度>2的所有模式:{ I2 I5:2, I1 I5:2, I2 I1 I5:2}

(2)

I5的情况是比较简单的,因为I5对应的条件FP-树是单路径的,我们再来看一下稍微复杂一点的情况I3:

I3的条件模式基是{ {I2 I1:2}, {I2:2}, {I1:2} },所以生成的条件FP-树如下图1,然后递归调用FP-growth,模式后缀为I3。I3的条件FP-树仍然是一个多路径树,把模式后缀I3和“条件FP-树”中的“项头表”中的每一项(即:I2和I1)取并集,得到一组模式{I2 I3:4, I1 I3:4}。

但是这一组模式不是后缀为I3的“所有的模式”,还需要递归调用FP-growth。

模式后缀为{I1,I3},可知{I1,I3}的条件模式基为{ {I2:2} },其生成的条件FP-树如下图2所示。这是一个单路径的条件FP-树,在FP_growth中把模式后缀{I1,I3}和“条件FP-树”中的“项头表”中的每一项(即:I2)取并集取并得到模式{I1 I2 I3:2}。

模式后缀为{I2,I3},因为{I2,I3}的条件模式基为空,递归调用结束。最终模式后缀I3的支持度>2的所有模式为:{I2 I3:4}, {I1 I3:4}, {I1 I2 I3:2}。

根据FP-growth算法,最终得到的支持度>2频繁模式如下:

FP-growth算法比Apriori算法快一个数量级,在空间复杂度方面也比Apriori也有数量级级别的优化。但是对于海量数据,FP-growth的时空复杂度仍然很高,可以采用的改进方法包括数据库划分,数据采样等等。


【数据挖掘】FPgrowth算法笔记相关推荐

  1. 数据挖掘原理与算法_技术分享|大数据挖掘算法之FPGrowth算法

    程一舰 数据技术处 我们常说我们生活在信息时代,实际上,我们更多的还是生活在数据时代.因为从过去到现在累积了大量的数据,对数据的挖掘和分析也仅是从最近几年大数据和人工智能技术的发展而兴起.我们对现有数 ...

  2. 数据挖掘算法之关联规则挖掘(二)FPGrowth算法

    之前介绍的apriori算法中因为存在许多的缺陷,例如进行大量的全表扫描和计算量巨大的自然连接,所以现在几乎已经不再使用 在mahout的算法库中使用的是PFP算法,该算法是FPGrowth算法的分布 ...

  3. 【机器学习】数据挖掘算法——关联规则(三),FP-growth算法

    前言   上一篇文章介绍了用来挖掘发现强关联规则的Apriori算法.同时也知道了Apriori算法在实现过程中由于需要频繁的扫描数据集导致效率较低.   FP-growth算法基于Apriori构建 ...

  4. 数据挖掘算法之FP-Growth算法介绍及Spark代码实现

    FP-Growth算法 概述 阶段1:FP树构建 步骤1:清洁和分类 步骤2:构造FP树,带有已清理项目集的头表 阶段2:开采主要树和条件FP树 步骤1:将主要FP树划分为条件FP树 步骤2:递归地挖 ...

  5. 数据挖掘:FP-Growth算法 (Python实现)

    目录 介绍 代码实现与解释 感谢 pyfpgrowth 1.0 版本 漏掉频繁项集分析 介绍 item_sets = [['f', 'a', 'c', 'd', 'g', 'i', 'm', 'p'] ...

  6. 【数据挖掘】4、关联分析:Apriori、FP-Growth 算法、买面包是否也爱买啤酒

    文章目录 一.概念 1.1 支持度 1.2 置信度 1.3 提升度 二.Apriori 算法 2.1 频繁项集的定义 2.2 手动推导 2.3 SDK 实战 2.3.1 超市购物 2.3.2 挑选演员 ...

  7. Spark机器学习(9):FPGrowth算法

    关联规则挖掘最典型的例子是购物篮分析,通过分析可以知道哪些商品经常被一起购买,从而可以改进商品货架的布局. 1. 基本概念 首先,介绍一些基本概念. (1) 关联规则:用于表示数据内隐含的关联性,一般 ...

  8. FP-growth算法高效发现频繁项集

    在用搜索引擎时,我们发现输入单词的一部分时,搜索引擎会自动补全查询词项,这里的原理其实是通过查询互联网上的词来找出经常出现在一块的词对,这需要一种高效发现频繁集的方法. 它基于Apriori构建,但在 ...

  9. MapReduce改造fp-growth算法

    1. FP-Growth算法弊端 FP-Growth算法是挖掘频繁项集最常用的算法之一,其是基于迭代FP-Tree生成频繁项集的关联规则算法.此算法仅进行两次数据集扫描,递归迭代构建FP-Tree(F ...

最新文章

  1. Git学习笔记07-删除文件
  2. NFS挂载失败(Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0))
  3. CSP认证201709-1 打酱油[C++题解]:贪心
  4. java 线上运维_一次java应用线上运维实战
  5. 全国计算机等级考试题库二级C操作题100套(第78套)
  6. 通讯网关 api网关_API网关正在经历身份危机
  7. LCD 设备驱动框架分析及核心结构
  8. mysql高级查询面试_高级MySQL数据库面试问题 附答案
  9. CBOW模型的数据预处理
  10. Etherchannel 备忘
  11. asp.net中防刷新重复提交与防后退解决办法
  12. 【bzoj1507】[NOI2003]Editor
  13. 对waitpid 的学习
  14. ASP中Application与Sesstion对象的使用实例
  15. wordpress主题怎样获取当前用户的相关信息?
  16. 多头注意力比单头好在哪?
  17. SVN安装配置以及启动
  18. 51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)...
  19. 【软碟通 | UltraISO】刻录光盘教程(制作U盘启动盘)
  20. IC卡读写器c++builder源代码续

热门文章

  1. linux 远程连接和文件传输
  2. linux实验六磁盘综合管理
  3. java 接口访问权限_详解Java之路(五) 访问权限控制
  4. MAC-mojave 关于VMware虚拟机键盘鼠标失灵以及虚拟机黑屏的解决方法
  5. Json转String,String转Json
  6. IDEA局部代码格式化的方法
  7. acer switch 10 linux,【AcerSwitch10E评测】拆开来用的电脑 Acer Switch 10E评测_Acer Switch 10E_笔记本评测-中关村在线...
  8. Android之数据持久化技术
  9. python 十进制转十六进制 蓝桥
  10. Android Studio上非常棒的插件