FP树(附)

Apriori算法和FPTree算法都是数据挖掘中的关联规则挖掘算法,处理的都是最简单的单层单维布尔关联规则。

转自http://blog.csdn.net/sealyao/article/details/6460578

Apriori算法

Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。是基于这样的事实:算法使用频繁项集性质的先验知识。Apriori使用一种称作逐层搜索的迭代方法,k-项集用于探索(k+1)-项集。首先,找出频繁1-项集的集合。该集合记作L1L1用于找频繁2-项集的集合L2,而L2用于找L3,如此下去,直到不能找到频繁k-项集。找每个Lk需要一次数据库扫描。

这个算法的思路,简单的说就是如果集合I不是频繁项集,那么所有包含集合I的更大的集合也不可能是频繁项集。

算法原始数据如下:


TID


List of item_ID’s


T100

T200

T300

T400

T500

T600

T700

T800

T900


I1,I2,I5

I2,I4

I2,I3

I1,I2,I4

I1,I3

I2,I3

I1,I3

I1,I2,I3,I5

I1,I2,I3

算法的基本过程如下图:

首先扫描所有事务,得到1-项集C1,根据支持度要求滤去不满足条件项集,得到频繁1-项集。

下面进行递归运算:

已知频繁k-项集(频繁1-项集已知),根据频繁k-项集中的项,连接得到所有可能的K+1_项,并进行剪枝(如果该k+1_项集的所有k项子集不都能满足支持度条件,那么该k+1_项集被剪掉),得到项集,然后滤去该项集中不满足支持度条件的项得到频繁k+1-项集。如果得到的项集为空,则算法结束。

连接的方法:假设项集中的所有项都是按照相同的顺序排列的,那么如果[i]和[j]中的前k-1项都是完全相同的,而第k项不同,则[i]和[j]是可连接的。比如中的{I1,I2}和{I1,I3}就是可连接的,连接之后得到{I1,I2,I3},但是{I1,I2}和{I2,I3}是不可连接的,否则将导致项集中出现重复项。

关于剪枝再举例说明一下,如在由生成的过程中,列举得到的3_项集包括{I1,I2,I3},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5},但是由于{I3,I4}和{I4,I5}没有出现在中,所以{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}被剪枝掉了。

海量数据下,Apriori算法的时空复杂度都不容忽视。

空间复杂度:如果数量达到的量级,那么中的候选项将达到的量级。

时间复杂度:每计算一次就需要扫描一遍数据库。

FP-Tree算法

FPTree算法:在不生成候选项的情况下,完成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的条件树就是:

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

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

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

procedure FP_growth(Treea)

if Tree 含单个路径then{

         for 路径P中结点的每个组合(记作b

产生模式b U a,其支持度support = 中结点的最小支持度;

} else {

         for each i 在Tree的头部(按照支持度由低到高顺序进行扫描){

产生一个模式b = i U a,其支持度support .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()获得多元频繁项集。

下面举两个例子说明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-树如左下图,然后递归调用FP-growth,模式前缀为I3。I3的条件FP-树仍然是一个多路径树,首先把模式后缀I3和条件FP-树中的项头表中的每一项取并集,得到一组模式{I2 I3:4, I1 I3:4},但是这一组模式不是后缀为I3的所有模式。还需要递归调用FP-growth,模式后缀为{I1,I3},{I1,I3}的条件模式基为{I2:2},其生成的条件FP-树如右下图所示。这是一个单路径的条件FP-树,在FP_growth中把I2和模式后缀{I1,I3}取并得到模式{I1 I2 I3:2}。理论上还应该计算一下模式后缀为{I2,I3}的模式集,但是{I2,I3}的条件模式基为空,递归调用结束。最终模式后缀I3的支持度>2的所有模式为:{ I2 I3:4, I1 I3:4, I1 I2 I3:2}

         

图1                                                                     图2

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


item


条件模式基


条件FP-树


产生的频繁模式


I5

I4

I3

I1


{(I2 I1:1),(I2 I1 I3:1)

{(I2 I1:1), (I2:1)}

{(I2 I1:2), (I2:2), (I1:2)}

{(I2:4)}


<I2:2, I1:2>

<I2:2>

<I2:4, I1:2>, <I1:2>

<I2:4>


I2 I5:2, I1 I5:2, I2 I1 I5:2

I2 I4:2

I2 I3:4, I1 I3:4, I2 I1 I3:2

I2 I1:4

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

时间: 2024-08-08 11:11:36

FP树(附)的相关文章

FP-growth算法(一)——通过构建FP树发现频繁项集

常见的挖掘频繁项集算法有两类,一类是Apriori算法,另一类是FP-growth.Apriori通过不断的构造候选集.筛选候选集挖掘出频繁项集,需要多次扫描原始数据,当原始数据较大时,磁盘I/O次数太多,效率比较低下.FPGrowth不同于Apriori的"试探"策略,算法只需扫描原始数据两遍,通过FP-tree数据结构对原始数据进行压缩,效率较高. FP代表频繁模式(Frequent Pattern) ,算法主要分为两个步骤:FP-tree构建.挖掘频繁项集. FP树表示法 FP树

FP树与python实现

FP-growth算法可以高效的发现频繁项集,但是该算法不能去发现关联规则,FP-growth算法 只需要对数据库进行两次扫描,一般情况下其算法效率高于Apriori算法两个数量级. 一颗FP树是如下图1所示: 跟别的树没什么区别,只是增加了相似节点的链接. FP树的定义: class treeNode : def __init__(self,nameValue,numOccur,parentNode): self.name = nameValue self.count = numOccur s

可持久化线段树附图解

前言 可持久化线段树主要用于对于历史版本的查询修改. 举个例子,目前修改了10次,现在要返回第7次修改后的版本进行查询修改,那么这样就要用到可持久化线段树. 当你要进行对于历史版本的查询修改,自然要记录历史版本,但如果对于每个历史版本建立都一棵新的线段树,显然会爆空间.那如何使用可持久化线段树呢. 原理 先看一幅图: 灰色的节点是不存在的,只是意义上的. 红色线是连到前一棵树的 现在修改i这个位置,i'是修改后的i,i'和它的所有祖先都是新建的节点. 容易看出,原理就是: 对于每个被修改的位置,

FP Tree算法原理总结

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

FP - growth 发现频繁项集

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

ZOJ 2112 Dynamic Rankings(主席树の动态kth)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. T

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行,既