FP-GROWTH 算法
1. 简介:
作者:韩嘉炜。应该是中国人吧,鼓掌!
一种非常好的发现频繁项集算法。
基于Apriori算法构建,使用叫做 FP树 的数据结构结构来存储集合。在某种意义上来说,就是Aprori的优化算法。
2. 优缺点
优点:
- 速度更快,FP-growth 算法只需要对数据集遍历两次。
- 压缩数据,FP树将集合按照支持度降序排序。不同路径如果有相同前缀路径,则共用存储空间,这使得数据得到了压缩。
- 不需要生成候选集。
缺点:
- FP-Tree第二次遍历会存储很多中间过程的值,会占用很多内存。
- 构建FP-Tree是比较昂贵的。
- 只能用于找频繁项集,不能挖掘其中的规则。
3. 步骤
为了更好的解释原理,先用最最简单的方式,进行过程的说明。这里有一组数据:
Date = [['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']]
第一步:支持度计数。就像这样{'z': 5, 'r': 3, 't': 3, 'x': 4, 'y': 3, 's': 3}
然后进行首项降序排序。
第二步:构建FP-TREE。FP-TREE是一种树形数据结构,FP-GROWTH算法专用。按照降序,从z开始,构建如下类型的树。
z 5
r 1
x 3
t 3
y 2
s 2
r 1
y 1
x 1
r 1
s 1
第三步:在树中挖掘频繁项集。
4. FP树的节点结构
这里是用python3定义的树的节点。
class treeNode:
def __init__(self, nameValue, numOccur, parentNode):
self.name = nameValue # 节点名称
self.count = numOccur # 节点出现次数
self.nodeLink = None # 不同项集的相同项通过nodeLink连接在一起
self.parent = parentNode # 指向父节点
self.children = {
} # 存储叶子节点
5. 具体的原理和步骤:
步骤1
1:遍历所有的数据集合,计算所有项的支持度。
2.丢弃非频繁的项。基于 支持度 降序排序所有的项。
3. 所有数据集合按照得到的顺序重新整理。重新整理完成后,丢弃每个集合末尾非频繁的项。
步骤2
读取每个集合插入FP树中,同时用一个头部链表数据结构维护不同集合的相同项。最终得到上面这样一棵FP树 。
步骤3
在频繁树中,挖掘出类似如下的频繁项集。
中间过程很细节,等找到合适的画图软件,再写个详细的版本。
[{
'r'}, {
't'}, {
'z', 't'}, {
'x', 't'}, {
'z', 'x', 't'}, {
'y'}, {
'z', 'y'},
{
'y', 'x'}, {
'z', 'y', 'x'}, {
'y', 't'}, {
'z', 'y', 't'}, {
's'}, {
'x', 's'},
{
'x'}, {