FP-Growth算法的介绍

引言:

在关联分析中,频繁项集的挖掘最常用到的就是Apriori算法。Apriori算法是一种先产生候选项集再检验是否频繁的“产生-测试”的方法。这种方法有种弊端:当数据集很大的时候,需要不断扫描数据集造成运行效率很低。

而FP-Growth算法就很好地解决了这个问题。它的思路是把数据集中的事务映射到一棵FP-Tree上面,再根据这棵树找出频繁项集。FP-Tree的构建过程只需要扫描两次数据集。

更多关联分析和Apriori算法的信息请见:什么是关联分析Apriori算法的介绍

正言:

我们还是用购物篮的数据:

TID Items
001 Cola, Egg, Ham
002 Cola, Diaper, Beer
003 Cola, Diaper, Beer, Ham
004 Diaper, Beer

TID代表交易流水号,Items代表一次交易的商品。

首先,FP-Growth算法的任务是找出数据集中的频繁项集。

然后,FP-Growth算法的步骤,大体上可以分成两步:(1)FP-Tree的构建; (2)FP-Tree上频繁项集的挖掘。

FP-Tree的构造:

  1. 扫描一遍数据库,找出频繁项的列表 L,按照支持度计数递减排序。即:

    L = <(Cola:3), (Diaper:3), (Beer:3), (Ham:2)>

  2. 再次扫描数据库,由每个事务不断构建FP-Tree:

    ①FP-Tree的根节点为 null 。

    ②从数据库中取出事务,按照 L 排序,然后把每个项逐个添加到FP-Tree的分枝上去。例如,事务001排序后为{Cola, Ham},在根节点上加一棵子树Cola-Ham。事务002排序后为{Cola, Diaper, Beer},因为根节点上已经有个子树节点“Cola”,所以可以共用该节点,在Cola节点上加一棵子树Diaper-Beer,同时Cola的计数加1。事务003可与树共用节点Cola-Diaper-Beer,所以只需在Beer后面加个子树节点“Ham”,同时把Cola、Diaper、Beer的计数加 1 即可。·········

  3. FP-Tree还有一样东西:头结点表。作用是将所有相同的项链接起来,这样比较容易遍历。

    最后得到的FP-Tree如下:

构造FP-Tree的伪代码如下:

算法:FP-Tree构造算法

输入:事务数据集 D,最小支持度阈值 min_sup

输出:FP-Tree

(1)   扫描事务数据集 D 一次,获得频繁项的集合 F 和其中每个频繁项的支持度。对 F 中的所有频繁项按其支持度进行降序排序,结果为频繁项表 L ;

(2)   创建一个 FP-Tree 的根节点 T,标记为“null”;

(3)   for 事务数据集 D 中每个事务 Trans do

(4)     对 Trans 中的所有频繁项按照 L 中的次序排序;

(5)     对排序后的频繁项表以 [p|P] 格式表示,其中 p 是第一个元素,而 P 是频繁项表中除去 p 后剩余元素组成的项表;

(6)     调用函数 insert_tree( [p|P], T );

(7)   end for

insert_tree( [p|P], root)

(1)   if root 有孩子节点 N and N.item-name=p.item-name then

(2)     N.count++;

(3)   Else

(4)     创建新节点 N;

(5)     N.item-name=p.item-name;

(6)     N.count++;

(7)     p.parent=root;

(8)     将 N.node-link 指向树中与它同项目名的节点;

(9)   end if

(10)  if P 非空 then

(11)    把 P 的第一项目赋值给 p,并把它从 P 中删除;

(12)    递归调用 insert_tree( [p|P], N);

(13)  end if


从FP-Tree提取频繁项集:

这一步骤稍微比较难理解一点,求解以某个项为后缀的频繁项集分成两步:找出它的条件模式基;根据条件模式基构造它的条件FP-树。出现了几个新名词,下面直接针对购物篮的FP-Tree进行讲解吧。

求以“Ham”为后缀的频繁项集:

  • 根据头结点表找出“Ham”结尾的路径:<Cola:3, Ham:1> 和<Cola:3, Diaper:2, Beer:2, Ham:1>,代表的意义是 原数据集中(Cola, Ham)和(Cola, Diaper, Beer, Ham)各出现了一次。
  • “Ham”的两个前缀路径{(Cola:1), (Cola Diaper Beer:1)}构成了“Ham”的条件模式基
  • 根据条件模式基构建“Ham”的条件FP-树:因为在Ham的条件模式基中 Diaper、Beer 只出现了一次,Coal 出现了两次,所以 Diaper、Beer 是非频繁项,不包含在Ham的条件FP-树中。
  • “Ham”的条件FP-树只有一个分支<Cola:2>,得到条件频繁项集 {Cola:2}。
  • 条件频繁项集 {Cola:2} 和后缀模式“Ham”合并,得到频繁项集 {Cola Ham:2}。

求以“Beer”为后缀的频繁项集:

  • “Beer”的条件模式基有{(Cola Diaper:2), (Diaper:1)}。
  • “Beer”的条件FP-树如下。
  • “Beer”为后缀的频繁项集为 {Cola Diaper Beer:2}、{Diaper Beer:2}、{Cola Beer:2}

求以“Diaper”为后缀的频繁项集:

  条件模式基为{(Cola:2)},最后求得频繁项集为{Cola Diaper:2}。

综上,得到的频繁项集有:{Cola Ham:2}、{Cola Beer:2}、{Diaper Beer:2}、{Cola Diaper:2}、{Cola Diaper Beer:2}。

从FP-Tree提取频繁项集的伪代码如下:

算法:FP-Growth(FP-Tree, α);

输入:已经构造好的 FP-Tree,项集 α(初值为空),最小支持度 min_sup;

输出:事务数据集 D 中的频繁项集 L;

(1)   L 初值为空

(2)   if Tree 只包含单个路径 P then

(3)     for 路径 P 中节点的每个组合(记为 β) do

(4)       产生项目集 α∪β,其支持度 support 等于 β 中节点的最小支持度数;

(5)       return L = L ∪ 支持度数大于 min_sup 的项目集 β∪α

(6)   else    //包含多个路径

(7)     for Tree 的头表中的每个频繁项 αf do

(8)       产生一个项目集 β = αf∪α,其支持度等于 αf 的支持度;

(9)       构造 β 的条件模式基 B,并根据该条件模式基 B 构造 β 的条件 FP- 树 Treeβ;

(10)       if Treeβ≠Φ then

(11)         递归调用 FP-Growth(Treeβ, β);

(12)       end if

(13)     end for

(14)  end if

(15)  产生一个模式 β = ai∪α, 其支持度 support = ai.support;

(16)  构造 β 的条件模式基,然后构造 β 的条件 FP-树 Treeβ;

(17)  if Treeβ≠Φ then

(18)    调用 FP-Growth(Treeβ, β);

(19)  }

时间: 2024-08-29 07:42:47

FP-Growth算法的介绍的相关文章

Frequent Pattern 挖掘之二(FP Growth算法)(转)

FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树).下面就详细谈谈如何构造这个树,举例是最好的方法.请看下面这个例子: 这张表描述了一张商品交易清单,abcdefg代表商品,(ordered)frequent items这一列是把商品按照降序重新进行了排列,这个排序很重要,我们操作的所

Aprior算法、FP Growth算法

数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据集中频繁出现的模式.举个例子,比如在超市的交易系统中,记载了很多次交易,每一次交易的信息包括用户购买的商品清单.如果超市主管是个有心人的话,他会发现尿不湿,啤酒这两样商品在许多用户的购物清单上都出现了,而且频率非常高.尿不湿,啤酒同时出现在一张购物单上就可以称之为一种频繁模式,这样的发掘就可以称之为

FP—Growth算法

FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录,最小支持度是2%, 用Apriori算法要半个小时但是用FP_growth算法只要6分钟就可以了,效率非常明显. 它的核心是FP_tree,一种树型数据结构,特点是尽量把相同元素用一个节点表示,这样就大大减少了空间,和birch算法有类似的思想.还是以如下数据为例. 每一行表示一条交易,共有9行,既

FP Tree算法原理总结

在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集,因此提高了算法运行的效率.下面我们就对FP Tree算法做一个总结. 1. FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示: 第一部分是一个项

FP Growth

在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集,因此提高了算法运行的效率.下面我们就对FP Tree算法做一个总结. 1. FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示: 第一部分是一个项

【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6(0.8和0.9版本都不包含该算法.Mahout0.6可以和Hadoop2.2.0和平共处有点意外orz) 部分输入数据,输入数据一行代表一个购物篮: 4750,19394,25651,6395,5592 26180,10895,24571,23295,20578,27791,2729,8637 7

FP - growth 发现频繁项集

FP - growth是一种比Apriori更高效的发现频繁项集的方法.FP是frequent pattern的简称,即常在一块儿出现的元素项的集合的模型.通过将数据集存储在一个特定的FP树上,然后发现频繁项集或者频繁项对.通常,FP-growth算法的性能比Apriori好两个数量级以上. FP树与一般的树结构类似,但它通过链接(Link)来连接相似元素,被连起来的元素项可以看成一个链表. 上图是一棵FP树,一个元素项可以在一棵FP树种出现多次,FP树的节点会存储项集的出现频率,每个项集会以路

目前流行的几种排课算法的介绍

通用高校排课算法研究----2 .目前流行的几种排课算法的介绍 2   目前流行的几种排课算法的介绍 2.1. 自动排课算法 1 .问题的描述 我们讨论的自动排课问题的简化描述如下: 设要安排的课程为{ C1 , C2 , ., Cn} ,课程总数为n , 而各门课程每周安排次数(每次为连续的2 学时) 为{ N1 , N2 , ., Nn} ;每周教学日共5 天,即星期一- 星期五;每个教学日最多安排4次课程教学,即1 - 2 节.3 - 4 节.5 - 6 节和7 - 8 节(以下分别称第1

红黑树(一)之 原理和算法详细介绍---转帖

目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang    于 2013-08-08 概述:R-B Tree,又称为"红黑树".本文参考了<算法导论>中红黑树相关知识,加之自己的理解,然后以图文的形式对红黑树进行说明.本文的主要内容包括:红黑树的特性,红黑树的时间复杂度和它的证明,红黑树的左旋.右旋.插入.删除等操作. 请尊重版权,转

眼下流行的几种排课算法的介绍

通用高校排课算法研究----2 .眼下流行的几种排课算法的介绍 2眼下流行的几种排课算法的介绍 2.1. 自己主动排课算法 1 .问题的描写叙述 我们讨论的自己主动排课问题的简化描写叙述例如以下: 设要安排的课程为{ C1 , C2 , ., Cn} ,课程总数为n , 而各门课程每周安排次数(每次为连续的2 学时) 为{ N1 , N2 , ., Nn} ;每周教学日共5 天,即星期一- 星期五;每一个教学日最多安排4 次课程教学,即1 - 2 节.3 - 4 节.5 - 6 节和7 - 8