机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
[comment]: # 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
前言
最近在看Peter Harrington写的“机器学习实战”,这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集。
基本概念
FP-growth算法
FP-growth算法的性能很好,只需要扫描两次数据集,就能生成频繁项集。但不能用于发现关联规则。
我想应该可以使用Apriori算法发现关联规则。
FP代表频繁模式(Frequent Pattern)。条件模式基(conditional pattern base)。
条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前缀路径(prefix path)。
一条前缀路径是介于所查找元素项与树根节点之间的所有内容。
FP-growth算法 - 用途
- 快速生成频繁项集
- 在一批有共性的文章中找到经常出现的匹配词汇(共现词),并进一步发现关联规则。可以用于输入自动补全功能。
- 发现数据中的共性。比如,可以找到,哪类用户喜欢哪些文章。
核心算法解释
FP-growth算法:生成频繁项集
FP-growth算法 - Step 1:生成FP树
输入
- 数据集[数据,出现次数]
注:出现次数默认为1。在第二步的时候,会再次用到这个方法,这是出现次数就用其用途了。 - 最小支持度
- 数据集[数据,出现次数]
输出
- FP树:FPTree
FPTree的根节点为项名为null的节点。
- 头指针表: headerTable
Tree Node 的数据结构
- name : 项名
- count : 其路径在数据集中出现的频率
- nodeLink : 指向在FP树下一个同项名的项。
- parent : 父节点
- children : 子节点
Header Table Item 的数据结构
- name : 项名
- count : 在数据集中出现的频率
- nodeLink : 指向在FP树第一个同项名的项。
逻辑过程
- 输入
- sample 数据集
- 输入
| 事务ID | 事务中的项集 |
|---|---|
| 1 | 'a', 's', 'w', 'x' |
| 2 | 'a', 'd', 's' |
| 3 | 'a', 'w' |
| 4 | 'a', 'x' |
| 5 | 'a', 'd', 'w' |
| 6 | 'a', 'e', 's' |
- 最小支持度为3
- Step 1: 生成Header Table。
遍历数据集,获得每个元素项的出现频率
去掉不满足最小支持度的元素项。
结果如下:
| 元素项 | 出现频率 |
|---|---|
| a | 6 |
| s | 3 |
| w | 3 |
注: 项d,e,x被去掉了,由于它们的出现频率小于最小支持率3。
- Step 2: 生成FP Tree。
遍历数据集,
对当前项集,去掉不在Header Table中的项。
对当前项集,按照在Header Table中出现频率从大到小排序。
加入到FP Tree(), 并且对每项,更新Header Table Item或者Tree Node的NodeLink属性。
去掉不在Header Table中的项的结果:
| 事务ID | 事务中的项集 | 过滤并排序后的项集 |
|---|---|---|
| 1 | 'a', 's', 'w', 'x' | 'a', 's', 'w' |
| 2 | 'a', 'd', 's' | 'a', 's' |
| 3 | 'a', 'w' | 'a', 'w' |
| 4 | 'a', 'x' | 'a' |
| 5 | 'a', 'd', 'w' | 'a', 'w' |
| 6 | 'a', 'e', 's' | 'a' |
把处理过的项集加入 FP Tree 的过程:
按照路径找,如果有count++,如果没有增加一个节点,count=1
对新增加的节点,连接到上一个同项集或者header Table的项集的NodeLinker上。
示意图如下:
FP树的构建过程
Ø
Ø
Add {a,s,w}
a:1
s:1
w:1
a:6
s:3
w:3
Ø
a:2
s:2
w:1
Add {a,s}
Ø
a:3
s:2
w:1
Add {a,w}
w:1
Header Table
最终的结果如下:(输出的FP树和头指针表)
FP树和Header Table的最终结果
Ø
a:6
s:3
w:1
w:2
Header Table
a:6
s:3
w:3
FP-growth算法 - Step 2:生成频繁项集
- 输入
- FP树:PF Tree
- 头指针表: header Table
- 最小支持度
- 前缀项集: 初始值为Empty List (输出)
- 频繁项集List: 初始值为Empty List (输出)
- 输出
无 - 逻辑过程
对Header Table的项,按照count从小到大排序
对Header Table的每一元素项:
把当前元素项加入到频繁项集List中。(Header Table中的每个项都是满足最小支持度的)
前缀项集 = 前缀项集 + 当前元素项。
找到已当前元素项的结尾的条件模式基(到根节点的所有路径以及路径的count)。
将条件模式基看成一个数据集(每个数据有一个count数),用生成FP Tree的方法,生成新的FP Tree和Header Table。
注:上一步过滤掉了不满足最小支持度的子项集。(比如:对于元素项w,过滤掉了{s,a})
如果新的Header Table有数据:
使用生成频繁项集的方法(也就是递归调用本方法)继续生成(有n+1个元素项的)频繁项集。
- 每个元素项的条件模式基
| 元素项 | 条件模式基 |
|---|---|
| a | {}:6 |
| s | {a}:3 |
| w | {s,a}:1, {a}:2 |
- 元素项w的FP树和Header Table
注:元素项s和节点s实际上都不存在,因为不满足最小支持度。
- 元素项w的FP树和Header Table
元素项w的FP树和Header Table
Ø
a:3
s:1
Header Table
a:3
s:1
参考
- Machine Learning in Action by Peter Harrington
机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集的更多相关文章
- 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...
- 【机器学习实战】第12章 使用 FP-growth 算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...
- 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...
- 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...
- 【转载】 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
原文地址: https://www.cnblogs.com/steven-yang/p/5686473.html ------------------------------------------- ...
- 【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码
文章目录 1.改进约会网站匹配效果 1.1 准备数据:从文本文件中解析数据 1.2 分析数据:使用Matplotlib创建散点图 1.3 准备数据:归一化特征 1.4 测试算法:作为完整程序验证分类器 ...
- 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
- FP - growth 发现频繁项集
FP - growth是一种比Apriori更高效的发现频繁项集的方法.FP是frequent pattern的简称,即常在一块儿出现的元素项的集合的模型.通过将数据集存储在一个特定的FP树上,然后发 ...
随机推荐
- android 内置视频目录
在做引导界面的时候有一个视频文件, 把它放在res/raw目录下面. 引用方法 如下: videoView = (VideoView) findViewById(R.id.video_view); v ...
- iOS10 升级兼容必备参考
最近提交审核不通过,再iOS10上运行崩溃 .然后需要处理崩溃的问题,晚上找了一下,整理收集起来. 方便后续查看使用. 以下参考链接特别有用: http://blog.csdn.net/gbking/ ...
- WeifenLuo组件中如何设置停靠窗体的宽度
在项目中使用了WeifenLuo.WinFormsUI.Docking组件,窗体停靠效果非常棒. 现在项目出现了这样的需求,希望可以控制停靠窗体的宽度,因为默认的宽度往往会造成停靠窗体的内容显示不完全 ...
- MassTransit_契约的创建
消息契约的命名规范 命令模式:动词+对象 事件模式:对象+动词 不同模式下要求不同的主键 Creating a message contract In MassTransit, a message c ...
- python 跳出嵌套循环方法
class LoopError(Exception):pass rs = '' try: for i in range(1, 3): print i rs = 'one ' if i == 1: fo ...
- [LeetCode] Sparse Matrix Multiplication
Problem Description: Given two sparse matrices A and B, return the result of AB. You may assume that ...
- Ubuntu中QT使用FFmpeg的奇怪问题
FFmpeg都已经编译安装好了,QT的程序中调用av_register_all却总是在链接阶段报错,经过长时间的摸索,发现时静态链接库的问题,网上给出的答案都只能解决部分问题,所需的全部链接库如下: ...
- 使用UIKit制作卡牌游戏(二)ios游戏篇
转自朋友Tommy 的翻译,自己只翻译了第三篇教程. 译者: Tommy | 原文作者: Matthijs Hollemans写于2012/07/06 原文地址: http://www.raywend ...
- 在MACOS上实现交叉编译
在嵌入式开发过程中,设备的存储空间和运算能力通常会比较低,这时候,比如要编译一个linux的内核,嵌入式设备就不能胜任了,所以,实现交叉编译还是很必要的.通过交叉编译,我们就能够在我们的pc上编译出能 ...
- ruby中字符的转换
1.将表格名转成class名 classify "book_comments".classify => "BookComment" 2.class名转 ...