FP-growth算法

来源:互联网 发布:电脑动漫设计软件 编辑:程序博客网 时间:2024/06/05 05:19

FP-growth算法是基于Apriori算法构建的,但采用了高级的数据结构减少了扫描次数,因此大大加快了算法的执行速度。

FP-growth算法发现频繁项集的基本过程如下:
1、构建FP树;
2、从FP树中挖掘频繁项集。

上面我们谈到,FP-growth算法的优点是采用了高级的数据结构。那么这种高级的数据结构是什么呢?实际上就是FP树
FP树是一种输入数据的压缩表示。他通过把事务映射到FP树上来构造一条路径,换句话说,一个路径就是一条数据。这样如果不同事务之间的重叠路径越多,那么就有理由认为他们是频繁项集。由于不同的事务可能会有若干个相同的项,因此若它们的路径相互重叠越多,则使用FP树结构获得的压缩效果越好。

实际上,整个FP-growth算法中最最重要的就是构建FP树。因此,我们在讲解算法时,会着重讲解如何构建FP树。

OK,下面我们就一步一步地来讲解这个算法

假设,我们有这样一组数据:
这里写图片描述

第一步:FP树的创建

1、同Apriori算法一样,对数据库第一次扫描,得到候选1项集,然后对支持度进行计数,再滤掉不满足最小支持度的,得到了频繁1项集,并按逆序排序。于是我们就有
这里写图片描述

2、然后构建FP树;
2.1:首先创建树的根节点,用null表示
这里写图片描述

2.2:接着,我们进行第二次扫描数据库,对数据库中的每个事务按照先前的逆序进行处理,并对每个事务创建一个分枝,如下所示

例如,对数据库中的第一条记录{a,b}按逆序进行处理,还是{a,b}

这里写图片描述

第二条记录{b,c,d}按逆序处理,还是{b,c,d}。在创建分枝的时候,大家注意,这里是单独就从null结点分出去了。那为什么不从左边,叶子结点b那里接c,d呢?那是因为如果接了的话,那么从FP树来看,第二条记录就是{a,b,c,d}了。这显然是错误的。

这里写图片描述

第三条记录{a,c,d,e}按逆序处理,还是{a,c,d,e}
这里写图片描述

接下来依次进行这种操作,直至最后

这里写图片描述

由于这个实例选取的数据直接就是OK的,没有体现出过滤和逆序的操作。不清楚的同学,建议再看下这两张图,想一下,应该能理清整个流程。
这里写图片描述
(阀值为3)

这里写图片描述

OK,到这里应该流程理清了。在图中,我们可以看到一些虚线的箭头,可能有些同学还不清楚它是什么。
实际上FP-growth算法还有一个被称为头指针表的数据结构,用来记录各个元素项的总出现次数的数组。然后再附带一个指针指向FP树中该元素项的第一个节点。这样每个元素项都构成一条单链表,有助于快速访问树中的项。
下面,我们进行第二步。

从FP树中挖掘频繁项集

从FP树中挖掘频繁项集的步骤如下
1、从FP树中获得条件模式基;
2、利用条件模式基,构建一个条件FP树;
3、迭代重复步骤1步骤2,直到树包含一个元素项为止

这里出现了一个新的名次——条件模式基(condition pattern base)。它的定义是这样的:条件模式基是以所查找元素项为结尾的路径集合。
概念挺绕的,其实很简单 ,就是前缀路径。直接看示例

这里写图片描述

则每一个频繁元素项的所有条件模式基(前缀路径)为
这里写图片描述

发现规律了吗,z存在于路径{z}中,因此前缀路径为空,另添加一项该路径中z节点的计数值5构成其条件模式基;r存在于路径{r, z}、{r, y, x, z}、{r, s, x}中,分别获得前缀路径{z}、{y, x, z}、{s, x},另添加对应路径中r节点的计数值(均为1)构成r的条件模式基;

OK,我们按照上面的思路,从FP树中获得了每一个频繁项的条件模式基。接下来,我们就要利用条件模式基来构造FP条件树了。

首先要明白的是,对于每一个频繁项,都要创建一棵条件FP树。
那么怎样通过条件模式基创建条件FP树呢? 实际上构造条件FP树与FP树是完全一样的。
直接看示例。

例如,考察上表中最后一个t

频繁项:t
条件模式基:{z,x,y,s}:2,{z,x,y,r}:1

同样的,统计一下,过滤并按逆序排序
z:3
x:3
y:3
s:2
r:1

然后就可以构建条件FP树了。条件FP树的构造原理和上面的FP树构造原理相同。就是把条件模式基当作一条数据,然后逐条的构造FP树即可。
这里写图片描述

在这里,注意到元素项s以及r是条件模式基的一部分,但是它们并不属于条件FP树。因为在当前的输入中,s和r不满足最小支持度的条件。

其他几个也是这样操作。

最后,结合项与其对应的条件FP树进行分析过滤,就能够得出了频繁项集了。

来个示例图看看。
这里写图片描述
(最小支持度为2)

不清楚的同学,把条件模式基看作数据,自己构造每个项的条件FP树试试看。

FP增长是一个有趣的算法,它是深度优先的算法。它展示了如何使用事务数据集的压缩表示来有效的产生频繁项集,此外对于某些事务数据集,FP增长算法比标准的Apriori算法要快几个数量级,FP增长算法的运行性能取决于数据集的“压缩因子”。如果生成的FP树非常茂盛(在最坏的情况下,是一颗完全二叉树)则算法的性能显著下降,因为算法必须产生大量的子问题,并且需要合并每个子问题返回的结果。

参考文章:
FP Tree算法原理总结

原创粉丝点击