Skip to content

Commit c3080ad

Browse files
authored
Merge pull request #170 from mikechengwei/master
更新: fd-growth 算法文档
2 parents 8ea3b6d + ef27de6 commit c3080ad

8 files changed

Lines changed: 92 additions & 26 deletions
Lines changed: 92 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,100 @@
11

2-
# 12) 使用FP-growth算法来高效发现频繁项集
3-
4-
## 基本过程
5-
6-
- 构建FP树
7-
* 对原始数据集扫描两遍
8-
* 第一遍对所有元素项遍历,并记下出现次数。
9-
* 第二遍只扫描频繁元素。
10-
- 从FP树种挖掘频繁项集
11-
12-
## FP树介绍
13-
* FP-growth算法是将数据存储在一种称为FP树的紧凑的数据结构中,FP代表频繁模式(Frequent Pattem)每个项集以路径的方式存储在树中。
14-
* 包含:项集【集合中的单个元素+出现次数+父节点】
15-
* 与其他树结构相比
16-
* 它通过链接(link)来连接相似元素,被连起来的元素项可以看成一个链表。
17-
* 一个元素项可以出现多次
18-
* 相似项之间的链接即`节点链接`(node link), 用于快速发现相似项的位置。
19-
* 这种算法虽然能更高效的发现频繁子项,但是却不能用于发现关联规则。
20-
21-
## FP-growth算法 特点
22-
* 优点: 一般要快于Apriori。(通常性能要好两个数量级以上)
23-
* 缺点: 实现比较困难,在某些数据集上性能会下降。
2+
# 第12章 使用FP-growth算法来高效发现频繁项集
3+
4+
![](../images/12.Fd-growth/apachecn_fd_growth_homepage.png)
5+
6+
### 第11章 我们已经介绍了用Apriori算法发现频繁项集与关联规则,本章将继续关注发现频繁项集这一任务,并使用FP-growth算法更有效的挖掘频繁项集。
7+
8+
## FP-growth 算法简介
9+
10+
* 一种非常好的发现频繁项集算法。
11+
* 基于Apriori算法构建,但是数据结构不同,使用叫做 FP树 的数据结构结构来存储集合。下面我们会介绍这种数据结构。
12+
13+
## FP-growth 算法步骤
14+
- 基于数据构建FP树
15+
- 从FP树种挖掘频繁项集
16+
17+
## FP树 介绍
18+
* FP树的节点结构如下:
19+
20+
```python
21+
class treeNode:
22+
def __init__(self, nameValue, numOccur, parentNode):
23+
self.name = nameValue # 节点名称
24+
self.count = numOccur # 节点出现次数
25+
self.nodeLink = None # 不同项集的相同项通过nodeLink连接在一起
26+
# needs to be updated
27+
self.parent = parentNode # 节点的父节点
28+
self.children = {} # 存储儿子节点
29+
```
30+
31+
## FP-growth 原理
32+
基于数据构建FP树
33+
34+
步骤1:
35+
1. 遍历所有的数据集合,计算所有项的支持度。
36+
2. 丢弃非频繁的项。
37+
3. 基于 支持度 降序排序所有的项。
38+
![](../images/12.Fd-growth/步骤1-3.png)
39+
4. 所有数据集合按照得到的顺序重新整理。
40+
5. 重新整理完成后,丢弃每个集合末尾非频繁的项。
41+
![](../images/12.Fd-growth/步骤4-5.png)
42+
43+
步骤2:
44+
6. 读取每个集合插入FP树中,同时用一个头部链表数据结构维护不同集合的相同项。
45+
![](../images/12.Fd-growth/步骤6-1.png)
46+
最终得到下面这样一棵FD树
47+
![](../images/12.Fd-growth/步骤6-2.png)
48+
49+
50+
从FP树中挖掘出频繁项集
51+
52+
步骤3:
53+
1. 对头部链表进行降序排序
54+
2. 对头部链表节点从小到大遍历,得到条件模式基,同时获得一个频繁项集。
55+
![](../images/12.Fd-growth/步骤6-2.png)
56+
如上图,从头部链表 t 节点开始遍历,t 节点加入到频繁项集。找到以 t 节点为结尾的路径如下:
57+
![](../images/12.Fd-growth/步骤7-1.png)
58+
去掉FD树中的t节点,得到条件模式基<左边路径,左边是值>[z,x,y,s,t]:2,[z,x,y,r,t]:1 。条件模式基的值取决于末尾节点 t ,因为 t 的出现次数最小,一个频繁项集的支持度由支持度最小的项决定。所以 t 节点的条件模式基的值可以理解为对于以 t 节点为末尾的前缀路径出现次数。
59+
60+
3. 条件模式基继续构造条件 FD树, 得到频繁项集,和之前的频繁项组合起来,这是一个递归遍历头部链表生成FD树的过程,递归截止条件是生成的FD树的头部链表为空。
61+
根据步骤 2 得到的条件模式基 [z,x,y,s,t]:2,[z,x,y,r,t]:1 作为数据集继续构造出一棵FD树,计算支持度,去除非频繁项,集合按照支持度降序排序,重复上面构造FD树的步骤。最后得到下面 t-条件FD树 :
62+
![](../images/12.Fd-growth/步骤7-2.png)
63+
然后根据 t-条件FD树 的头部链表进行遍历,从 y 开始。得到频繁项集 ty 。然后又得到 y 的条件模式基,构造出 ty的条件FD树,即 ty-条件FD树。继续遍历ty-条件FD树的头部链表,得到频繁项集 tyx,然后又得到频繁项集 tyxz. 然后得到构造tyxz-条件FD树的头部链表是空的,终止遍历。我们得到的频繁项集有 t->ty->tyz->tyzx,这只是一小部分。
64+
* 条件模式基:头部链表中的某一点的前缀路径组合就是条件模式基,条件模式基的值取决于末尾节点的值。
65+
* 条件FD树:以条件模式基为数据集构造的FD树叫做条件FD树。
66+
67+
FP-growth 算法优缺点:
68+
69+
```
70+
* 优点: 1. 因为 FP-growth 算法只需要对数据集遍历两次,所以速度更快。
71+
2. FP树将集合按照支持度降序排序,不同路径如果有相同前缀路径共用存储空间,使得数据得到了压缩。
72+
3. 不需要生成候选集。
73+
4. 比Apriori更快。
74+
* 缺点: 1. FP-Tree第二次遍历会存储很多中间过程的值,会占用很多内存。
75+
2. 构建FP-Tree是比较昂贵的。
2476
* 适用数据类型:标称型数据(离散型数据)。
77+
```
78+
79+
80+
## FP-growth 代码讲解
81+
完整代码地址: <https://github.com/apachecn/MachineLearning/blob/master/src/python/12.FrequentPattemTree/fpGrowth.py>
82+
83+
main 方法大致步骤:
84+
```python
85+
if __name__ == "__main__":
86+
simpDat = loadSimpDat() #加载数据集。
87+
initSet = createInitSet(simpDat) #对数据集进行整理,相同集合进行合并。
88+
myFPtree, myHeaderTab = createTree(initSet, 3)#创建FP树。
89+
freqItemList = []
90+
mineTree(myFPtree, myHeaderTab, 3, set([]), freqItemList) #递归的从FP树中挖掘出频繁项集。
91+
print freqItemList
92+
```
93+
大家看懂原理,再仔细跟踪一下代码。基本就没有问题了。
2594

26-
## 项目实战
27-
* 1.从Twitter文本流中挖掘常用词。
28-
* 2.从网民页面浏览行为中挖掘常见模式。
2995

3096
* * *
3197

32-
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)**
98+
* **作者:[mikechengwei](https://github.com/mikechengwei)**
3399
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
34100
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
1.41 MB
Loading

images/12.Fd-growth/步骤1-3.png

70.5 KB
Loading

images/12.Fd-growth/步骤4-5.png

41.4 KB
Loading

images/12.Fd-growth/步骤6-1.png

133 KB
Loading

images/12.Fd-growth/步骤6-2.png

115 KB
Loading

images/12.Fd-growth/步骤7-1.png

68.9 KB
Loading

images/12.Fd-growth/步骤7-2.png

39.7 KB
Loading

0 commit comments

Comments
 (0)