|
1 | 1 |
|
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 | + |
| 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 | +  |
| 39 | + 4. 所有数据集合按照得到的顺序重新整理。 |
| 40 | + 5. 重新整理完成后,丢弃每个集合末尾非频繁的项。 |
| 41 | +  |
| 42 | + |
| 43 | +步骤2: |
| 44 | + 6. 读取每个集合插入FP树中,同时用一个头部链表数据结构维护不同集合的相同项。 |
| 45 | +  |
| 46 | + 最终得到下面这样一棵FD树 |
| 47 | +  |
| 48 | + |
| 49 | + |
| 50 | +从FP树中挖掘出频繁项集 |
| 51 | + |
| 52 | +步骤3: |
| 53 | + 1. 对头部链表进行降序排序 |
| 54 | + 2. 对头部链表节点从小到大遍历,得到条件模式基,同时获得一个频繁项集。 |
| 55 | +  |
| 56 | + 如上图,从头部链表 t 节点开始遍历,t 节点加入到频繁项集。找到以 t 节点为结尾的路径如下: |
| 57 | +  |
| 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 | +  |
| 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是比较昂贵的。 |
24 | 76 | * 适用数据类型:标称型数据(离散型数据)。 |
| 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 | +大家看懂原理,再仔细跟踪一下代码。基本就没有问题了。 |
25 | 94 |
|
26 | | -## 项目实战 |
27 | | -* 1.从Twitter文本流中挖掘常用词。 |
28 | | -* 2.从网民页面浏览行为中挖掘常见模式。 |
29 | 95 |
|
30 | 96 | * * * |
31 | 97 |
|
32 | | -* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)** |
| 98 | +* **作者:[mikechengwei](https://github.com/mikechengwei)** |
33 | 99 | * [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning> |
34 | 100 | * **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)** |
0 commit comments