目录
学习完机器学习实战的FP-growth,简单的做个笔记。文中部分描述属于个人消化后的理解,仅供参考。
本篇综合了先前的文章,如有不理解,可参考:
所有代码和数据可以访问 我的 github
如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~
0. 前言
从大规模的数据集中,寻找不同特征或者物品之间的隐含关系,称为关联分析(association analysis),或者关联规则学习(association rule learning)。
在 Apriori 算法中,寻找频繁项集,需要对每一个可能的频繁项扫描一遍数据集计算支持度,计算量庞大。
在 FP-growth 算法中,寻找频繁项集,只需要扫描两遍数据集,将数据存储在FP树的结构上,然后在FP树上挖掘频繁项集。
- 优点:速度一般要快于 Apriori。
- 缺点:实现比较困难,在某些数据集上性能会下降。
- 适用数据类型:标称型数据。
例如在下述例子中(图源:机器学习实战),右侧是一颗FP树:
事务ID | 事务中的元素项 |
---|---|
001 | r, z, h, j, p |
002 | z, y, x, w, v, u, t, s |
003 | z |
004 | r, x, n, o, s |
005 | y, r, x, z, q, t, p |
006 | y, z, x, e, q, s, t, m |
FP代表频繁模式(Frequent Pattern),一个元素项可以在一颗FP树上出现多次。
树节点上给出了当前节点的路径在数据集中的出现次数,例如{z:5}表示元素{z}在数据集中出现了5次;{y:3}表示路径{y, x, z}在数据集中出现了3次;{s:2}表示路径{s, y, x, z}在数据集中出现了2次。
左侧为头指针表,给出了每个元素在数据集中出现的次数,并由链表通过节点链接(node link)依次链接每个元素。部分元素因为不满足最小支持度的要求,所以不储存在FP树中。
在 FP-growth 算法中,同样采用了 Apriori 算法的思想,如果某个项是非频繁的,那么这个项的所有超集也是非频繁的。
1. 构建FP树
构建FP树的过程只需要扫描两遍数据集。
第一遍扫描,计算每个单个元素的频率,并根据最小支持度,滤除不满足的元素。
第二遍扫描,首先对数据集进行处理,每一条数据按照元素的绝对出现频率排序,并滤除不满足最小支持度的元素。
例如根据上述的头指针表,元素排序为{z:5, x:4, y:3, s:3, r:3, t:3},所以处理后的数据为:
事务ID | 事务中的元素项 | 过滤及排序后的元素 |
---|---|---|
001 | r, z, h, j, p | z, r |
002 | z, y, |