最近在看Peter Harrington写的“机器学习实战”,这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集。
FPTree的根节点为项名为null的节点。
事务ID | 事务中的项集 |
---|---|
1 | 'a', 's', 'w', 'x' |
2 | 'a', 'd', 's' |
3 | 'a', 'w' |
4 | 'a', 'x' |
5 | 'a', 'd', 'w' |
6 | 'a', 'e', 's' |
遍历数据集,获得每个元素项的出现频率
去掉不满足最小支持度的元素项。
结果如下:
元素项 | 出现频率 |
---|---|
a | 6 |
s | 3 |
w | 3 |
注: 项d,e,x被去掉了,由于它们的出现频率小于最小支持率3。
遍历数据集,
对当前项集,去掉不在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树和头指针表)
对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 |