简介
FP-Growth 算法和 Apriori 算法都被用作关联规则挖掘。 可以说FP-Growth就是Apriori的升级版,Fp-Growth可以节省运算时间,减少遍历次数,但同时也会增加内存使用空间。
FP-Growth算法只进行 2 次数据库扫描。相比于 Apriori 算法,没有候选集,而是直接生成一颗频繁项树,通过这棵树生成关联规则。
使用基本步骤为:
- 构建FP-Tree树
- 从树中挖掘信息
原理
构建FP-Tree
数据结构
在构建FP-Free时,需要一张相头表和一颗fp树
其中的节点链,可以为后期的信息挖掘提供遍历
几个要点
- 项头表是降序排序的
- 树中每个节点的祖先频繁度都大于该该节点
构建步骤
原始数据
TID | items |
---|---|
1 | a,b,c,g,h,j,d |
2 | a,c,d,e,g |
3 | b,c,a,d,g,h,j,k |
4 | c,d,a,b |
5 | t,g,h,j,a |
6 | a,k,l,p,t,o |
step1:
遍历原始数据计算项为1的频繁集出现次数,去除小于最小支持度的item,并且排序
下表以去除小于3的item
item | times |
---|---|
a | 6 |
c | 5 |
g | 4 |
b | 3 |
d | 3 |
h | 3 |
j | 3 |
step2:
根据得到的频度排序表,针对原始数据进行排序,并且去除不满足最小支持的的item
TID | items |
---|---|
1 | a,c,g,b,d,h,j |
2 | a,c,g,d |
3 | a,c,g,b,d,h,j |
4 | a,c,b,d |
5 | a,g,h,j |
6 | a |
step3:
根据setp2中得到的表构建fp-tree树
挖掘信息
建立好FP-Tree后就需要从中挖掘频繁项集,挖掘时需要从项头表底部项依次向上挖掘,对项头表中的每一项都需要得到模式基(模式基是以我们要挖掘的节点作为叶子节点所对应的FP子树)。得到这个FP子树,我们将子树中每个节点的的计数设置为叶子节点的计数,并删除计数低于支持度的节点。从这个条件模式基,我们就可以递归挖掘得到频繁项集了。
条件模式基
这里提一下条件模式基是个什么玩意儿,看了很多博客写的都不太一样,有点差异。
条件模式基(conditional pattern base)
首先从FP树头指针表中的单个频繁元素项开始。对于每一个元素项,获得其对应的条件模式基(conditional pattern base),单个元素项的条件模式基也就是元素项的关键字。条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前辍路径(perfix path)。简而言之,一条前缀路径是介于所査找元素项与树根节点之间的所有内容。
下图是以{s:2}或{r:1}为元素项的前缀路径:
挖掘信息时,一般是通过项头表从下往上挖掘,即step1中的表
item | times |
---|---|
a | 6 |
c | 5 |
g | 4 |
b | 3 |
d | 3 |
h | 3 |
j | 3 |
从j开始挖掘信息一直到a
算法实现
节点数据结构
class Node:
def __init__(self, x):
self.x = x
self.count = 1
self.father = None
self.children = {
}
构建FP-tree
class