PS:该系列数据都可以在图灵社区(点击此链接)中随书下载中下载(如下)
FP-growth算法:比Apriori算法要快。它基于Apriori构建,但是在完成相同任务时采用了一些不同的技术。这里的任务是将数据集存储在一个特定的称作FP树的结构之后发现频繁项集或者频繁相对,即常在一块出现的元素项的集合FP树。这个算法能够更有效地挖掘数据。这种算法虽然能更为高效地发现频繁项集,但不能用于发现关联规则。
FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁。FP-growth发现频繁项集的基本过程为:(1)构建FP树;(2)从FP树中挖掘频繁项集。
1 FP树:用于编码数据集的有效方式
FP-growth算法
优点:一般要快于Apriori
缺点:实现比较困难,在某些数据集上性能会下降。
适用数据类型:标称型数据。
FP-growth算法将数据存储在一种称为FP树的紧凑数据结构中。FP代表频繁模式(Frequent Pattern),如下图所示:
同搜索树不同的是,一个元素项可以在一棵FP树中出现多次。FP树会存储项集的出现频率,而每个项集会以路径的方式存储在树中。存在相似元素的机会会共享树的一部分。只有当集合之间完全不同时,树才会分叉。树节点上给出集合中的单个元素及其在序列中的出现次数,路径会给出该序列的出现次数。用于生成上图所示FP树的数据如下:
表中,元素项z出现了5次,集合{r, z}出现了1次等。而q、p和o等都没有在树中出现,这是因为这里也使用了支持度的定义,该指标对应一个最小阈值,低于最小阈值的元素项被认为是不频繁项。上面的FP树适用的最小支持度为3,因此q、p和o等并没有出现在最后的树中。
FP-growth算法的工作流程如下。首先构建FP树,然后利用它来挖掘频繁项集。为构建FP树需要对原始数据集扫描两遍。第一遍对所有元素项的出现次数进行计数。如果某元素是不频繁的,那么包含该元素的超集也是不频繁的,不需要考虑。数据库的第一遍扫描用来统计出现的频率,而第二遍扫描中只考虑那些频繁元素。
2 构建FP树
在第二次扫描数据集时会构建一棵FP树。为构建一棵树,需要一个容器来保存树。
2.1 创建FP树的数据结构
创建fpGrowth.py文件,编写如下代码,并在python命令行进行测试:
def loadSimpDat():
simpDat = [['r', 'z', 'h', 'j', 'p'],
['z', 'y', 'x', 'w', 'v', 'u', 't', 's'],
['z'],
['r', 'x', 'n', 'o', 's'],
['y', 'r', 'x', 'z', 'q', 't', 'p'],
['y', 'z', 'x', 'e', 'q', 's', 't', 'm']]
return simpDat
def createInitSet(dataSet):
retDict = {
}
for trans in dataSet:
retDict[frozenset(trans)] = 1
return retDict