第12章 使用FP-growth算法来高效发现频繁集

FP-growth算法将数据集存储在一个特定的称作FP树的结构之后发现频繁项集或者频繁项集对,即常在一起出现的元素项的集合FP树。这种做法使得算法的执行速度要快于Apriori算法,性能要好两个数量级以上。

FP-growth算法只需要对数据集记性两次扫描就能判定给定模式是否频繁,当数据库特别大时其优势越明显。但是这种算法不能用来发现关联规则。它发现频繁项集的过程:(1)构建FP树(2)从FP树中挖掘频繁项集。

12.1  FP树:用于编码数据集的有效方式

FP-growth算法将数据存储在一种称为FP树的紧凑数据结构中。FP代表频繁模式(Frequent Pattern)。

同搜索树不同的是,一个元素项可以在一棵FP树中多次出现。FP树会存储项集的出现频率,而每个项集会以路径的方式存储在树中。存在相似元素的集合会共享树的一部分。只有当集合之间完全不同时,树才会分叉。树节点上给出集合中单个元素及其在序列中出现的次数,路径会给出该序列的出现次数。相似项之间的链接叫做节点链接,用于快速发现相似项的位置。

FP-growth算法工作流程如下:首先构建FP树,然后利用它来挖掘频繁项集。为构建FP树,需要对原始数据集扫描两遍。第一遍对所有元素项的出现次数进行统计,如果某元素是不频繁的,那么它的超集也是不频繁的。数据库第一遍扫描用来统计出现的频率,第二遍扫描中只考虑那些频繁的元素。

12.2  构建FP树

12.2.1  创建FP树的数据结构


第12章 使用FP-growth算法来高效发现频繁集_第1张图片
FP树的数据结构

12.2.2  构建FP树

这里使用一个字典作为数据结构,来保存头指针表。除了存放指针外,头指针表还可以用来保存FP树中每个元素是总数。

第一次遍历数据集会获得每个元素项的出现频率。接下来,去掉不满足最小支持度的元素项。在下一步构建FP树。在构建时,读入每个项集并将其添加到一条已经存在的路径中。如果该路径不存在,则创建一条新路径。每个事务都是一个无序集合。在将集合添加到树之前,需要对每个集合排序。排序基于元素项的绝对出现频率进行。在对事务记录过滤和排序之后,就可以侯建FP树了。从空集开始,向其中不断添加频繁项集。过滤、排序后的事务依次添加到树中。如果树中已存在现有元素,则增加现有元素的值。如果现有元素不存在,则向树添加一个分枝。

第12章 使用FP-growth算法来高效发现频繁集_第2张图片
FP树

上面给的是元素项及其对应的频率计数值,其中每个缩进表示所处的树的深度。

12.3  从一棵FP树中挖掘频繁项集

有了FP树之后,就可以抽取频繁项集了。首先从单元素项集合开始,然后在此基础上逐步构建更大的集合。

从FP树中抽取频繁项集的三个基本步骤:(1)从FP树中获得条件模式基;(2)利用条件模式基,构建一个条件FP树;(3)迭代重复步骤1和2 ,直到树包含一个元素项为止。

我们重点关注步骤(1),即寻找条件模式基。之后,为每一个条件模式基创建对应的条件FP树。最后构造少许代码封装上述两个函数,并从FP树中获得频繁项集。

12.3.1  抽取条件模式基

首先从上一节发现的已经保存在头指针表中的单个频繁元素项开始。对于每一个元素项,获得其对应的条件模式基(conditional pattern base)。条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前缀路径(prefix path)。简而言之,一条前缀路径是介于所查找元素项与根节点之间的所有内容。

每一条前缀路径都与一个计数值关联。前缀路径将用于构建条件FP树。为了获得这些前缀路径,可以对树进行穷举式搜索,直到获得想要的频繁项为止,或者使用一个更有效的方法来加速搜索过程。可以利用先前创建的头指针表来得到一种更有效的方法。头指针表包含相同类型元素链表的起始指针。一旦到达了每一个元素项,就可以上溯这棵树直到根节点为止。

第12章 使用FP-growth算法来高效发现频繁集_第3张图片
构建树的实际效果

有了条件模式基,就可以创建条件FP树。

12.3.2  创建条件FP树

对每个频繁项,都要创建一棵条件FP树。我们可以使用刚才发现的条件模式基作为输入数据,并通过相同的建树代码来构架这些树。然后,我们会递归地发现频繁项、发现条件模式基,以及发现另外的条件树。

第12章 使用FP-growth算法来高效发现频繁集_第4张图片

12.4  本章小结

FP-growth算法是一种用于发现数据集中频繁模式的有效方法。FP-growth算法利用Apriori算法的原则,但只对数据集扫描两次,执行更快。在FP-growth算法中,数据集存储在一个称为FP树的结构中。FP树构建完成后,可以通过查找元素项的条件基及构建条件树来发现频繁项集。该过程不断以更多元素作为条件重复进行,直到FP树中只包含一个元素为止。

使用FP-growth算法可以在多种文本文档中查找频繁单词,本文没有实践和记录实例。

你可能感兴趣的:(第12章 使用FP-growth算法来高效发现频繁集)