FP_growth算法

转载 2016年05月31日 13:54:27

FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点:第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录,最小支持度是2%,用Apriori算法要半个小时但是用FP_growth算法只要6分钟就可以了,效率非常明显。它的核心是FP_tree,一种树型数据结构,特点是尽量把相同元素用一个节点表示,这样就大大减少了空间,和birch算法有类似的思想。还是以如下数据为例。FP_growth算法
每一行表示一条交易,共有9行,既9笔交易,左边表示交易ID,右边表示商品名称。最小支持度是22%,那么每件商品至少要出现9*22%=2次才算频繁。第一次扫描数据库,统计每件商品出现的次数,按次数对各个商品递减排序,有:FP_growth算法。然后第二次扫描数据库,在每条交易中按此种顺序给商品排序,如果有某个商品出现的次数小于阈值2,则删除该商品,有:

FP_growth算法
剩下的就是构造FP_tree了,这是核心,树的每个节点的结构体如下:

//FP-tree的存储结构
typedef struct CSNode{
 //商品编号
 int item;
 //次数
 int count;
 //父节点,孩子节点,兄弟节点
 CSNode *parent,*firstchild,*nextsibling;
 //相同商品的前驱,后继节点,方便将相同商品的节点连接起来,根节点的直接孩子节点的这两个指针都是空
 CSNode *pre,*next;
}*CSTree;
其中item,*firstchild,*nextsibling是树这个结构体常用的属性。count记录商品item出现的次数,*parent是为了方便从叶子节点逆向访问根节点而设置的。*pre,*next的注释已经很清楚了。构造树的原则是:将每条记录看做一个从根节点到叶子节点的路径,如果某个商品在节点中已经存在了,则对应count计数器加1,相当于所有的前缀都要加1,如果不存在则在该条记录的后面商品开辟一条新的路径。下面一条一条记录演示怎么构造FP_tree。

    第三次访问数据库,构造FP_tree。第一条记录:I2,I1,I5,有:

FP_growth算法
父节点没有表示出来,根节点是空节点。2:1表示商品2出现了1次,其他表示类推。左边的数组按照商品顺序递减排列,保存了各个商品的当前指针,目的是为了在后面找到相同的后缀,将相同的商品用单项箭头虚线连起来,实际是双向链表链接的,并且将此时的节点商品1和节点商品5保存为商品1和商品5的当前指针,而对于商品2,商品3,商品4的当前指针还在左边的数组中保存。注意根节点的直接孩子不用连起来,后面会讲理由。第二条记录:I2,I4,有:

FP_growth算法
该记录和第一条记录共用前缀I2,所以商品2的次数要加1,而商品4则作为商品2的一个新孩子节点,这里没有把兄弟节点画出来。并且左边商品4要指向该节点,此时商品4的当前指针指向节点商品4。第三条记录:I2,I3,类似,结果是:

FP_growth算法
第四条记录:I2,I1,I4有:

FP_growth算法
当添加完商品4后,商品4的当前指针要指向新的节点商品4,此时两条红色的虚线就把以商品4为后缀的节点连起来了。第5条记录:I1,I3,有:

FP_growth算法
商品1由于和根节点的所有直接子孩子(这里只有商品2这个子孩子)不同,因此要另外开辟一条路径。商品3的当前指针要指向新的节点商品3,如图中的黄色虚线所指,到这里体现了构造FP_tree的一般性了。再把剩下的记录都加进来,最终的FP_tree是:

FP_growth算法
这颗FP_tree最大程度的把相同的商品放在用同一个节点保存,最大限度的节省了空间。剩下的工作就是挖掘这颗FP_tree了。

    挖掘的目的是找出FP_tree的各个路径中相同的集合,有两中方式,方式一,从根节点朝叶子节点顺着遍历树,方式二,从叶子节点朝根节点逆着遍历树。想想方式一挺麻烦的,幸亏我们设置了*parent指针,通过它就可以很方便的用方式二。我们从商品出现次数由少到多的顺序开始遍历树,先从商品5开始,由于有*pre,*next指针分方便将所有以商品5做为叶子节点的路径全找出来,然后再根据*parent指针找到父节点,根节点是空不用找。以I5做元素的条件模式基是:{(I2 I1:1),(I2 I1 I3:1)}。后面的1表示出现商品I2,I1,I5同时出现的次数。现在解释为什么:根节点的直接孩子不用*pre,*next指针连起来,因为假如连起来的话,那么以它为后缀时,将没有前缀,也就是说它的频繁项集是1,这在大多数情况下没意义。由它构造出条件FP_tree,注意由于开始按照商品名称排序了,那么条件模式基中的每一项也会按照这种方式排序。如果条件模式基中某项A是另外一项B的子集那么在算B时,要将A出现的次数加上,实现这个功能最简单明了的方法就是一一匹配,假如条件模式基共有N项,则时间复杂度是N的平方,若先按照条件模式基的长度递增排序得到:{(I2 I1:1),(I2 I1 I3:1)},排序的时间复杂度是N*log(N),那么只有可能是长度短的项是长度长的项的子集,此时总匹配次数是:N-1 + N-2 + ,,, + 1 = N*(N-1)/2,和前面的排序时间加起来是:N*log(N) + N*(N-1)/2当N大于时4时,该值小于N的平方。在实际中N一般会大于4。最终我们得到以I5作为后缀的频繁项集是:{I2 I5:2},{I1 I5:2},{I2 I1 I5:2}他们出现的次数都大于等于最小支持度。类似可以得到其它后缀的频繁项集。

    FP_growth算法不产生候选序列,并且只需要3次遍历数据库,对比Apriori算法而言有了很大的改进。其实想想这也符合历史发展的规律,Apriori在1993年才提出来的,那是数据挖掘才刚起步,而到2000年时,已经有了一定的发展,FP_growth是站在Apriori的肩膀上发明的,这种现象具有普遍性。

FP-Growth算法理解

第一次接触FP-Growth是在《数据挖掘概念与技术》,当时对它的理解只停留在概念层面。后来又在《机器学习实战》中接触到了它,结合着书中的讲解和代码,跑了点结果,理解加深了一点。最近,工作中需要使用到...
  • daizongxue
  • daizongxue
  • 2017年08月23日 11:45
  • 252

FP_growth算法

原文出处:http://blog.sina.com.cn/s/blog_6e85bf420100ogp8.html FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Ap...
  • whhit111
  • whhit111
  • 2015年09月15日 23:18
  • 500

FP_Growth算法

FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点:第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录,最...
  • VRML_0504
  • VRML_0504
  • 2014年08月22日 11:27
  • 525

FP-Growth算法的介绍

引言:在关联分析中,频繁项集的挖掘最常用到的就是Apriori算法。Apriori算法是一种先产生候选项集再检验是否频繁的“产生-测试”的方法。这种方法有种弊端:当数据集很大的时候,需要不断扫描数据集...
  • Bone_ACE
  • Bone_ACE
  • 2015年06月28日 10:31
  • 9431

FP-growth算法,fpgrowth算法详解

FP-growth算法,fpgrowth算法详解 使用FP-growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能:输入一个单词或者单词的一部分,搜索引擎酒会自动补全查询...
  • javastart
  • javastart
  • 2016年01月15日 08:40
  • 18178

FP_TREE和FP_GROWTH算法

一. FP树构造       FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,它不需要不断地生成候选项目队列和不断得扫描整个数据库进行比对。为了达到这样的效果,...
  • u013385925
  • u013385925
  • 2017年09月12日 21:38
  • 82

[Python]FPG(FP-growth)算法核心实现

FPG是FP-growth算法的简称,推荐算法=》关联算法中最有名的算法之一,是Apriori算法的性能优化版。 参考了一些示例,自行再实现,具体算法如下。 步骤归纳为: 1、第一次...
  • textboy
  • textboy
  • 2016年01月20日 11:47
  • 1210

FP-Growth算法python实现

前言:关于关联分析和FP_Growth的介绍请见:什么是关联分析、FP-Growth算法的介绍。本文主要介绍用 python 语言实现 FP_Growth 算法的代码。 正文:FP_Growth项目...
  • Bone_ACE
  • Bone_ACE
  • 2015年07月03日 22:51
  • 9018

fp_growth

import collections min_support = 3 def sp(s): return [a for a in s] #===========================...
  • muyoumuou
  • muyoumuou
  • 2013年10月26日 16:01
  • 486

数据挖掘 关联规则的FP-growth-tree(FP增长树)的python实现 使用方法

数据挖掘 关联规则的FP-growth-tree(FP增长树)的python实现 使用方法代码地址 点我去找代码 目录结构 FP_Grow_tree.py :入口类 fptree.py:构建树的类...
  • Dodd9199
  • Dodd9199
  • 2016年03月31日 15:01
  • 1143
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FP_growth算法
举报原因:
原因补充:

(最多只允许输入30个字)