当搜索引擎输入一个单词的时候,会自动补全查询词项。用的就是FP-growth算法,一种用来高效发现频繁集的方法。比Apriori算法更快。
应用:用于识别经常出现的元素相,制定决策、推荐元素或进行预测等。
任务:将数据集存储在一个特定的称作FP树的结构之后发现频繁项对,即常在一块出现的元素项的集合FP树。执行速度比Apriori性能要好两个数量级以上。
每次增加频繁项集的大小,Apriori算法都会重新扫描整个数据集,而FP-growth算法只需要对数据库进行两次扫描。
过程:
(1)构建FP树
- 1)第一遍对所有元素项的出现次数进行计数。
- 2)第二遍扫描去掉不满足最小支持度的元素,按序读入每个项集并添加到一个存在的路径中,构建FP树。
事务数据集(最小支持度为3)
事务ID | 事务中的元素项 | 过滤及重排后的元素项 |
001 | r,z,h,j,p | z,r |
002 | z,y,x,w,v,u,t,s | z,x,y,s,t |
003 | z | z |
004 | r,x,n,o,s | x,s,r |
005 | y,r,x,z,q,t,p | z,x,y,r,t |
006 | y,z,x,e,q,s,t,m | z,x,y,s,t |
实现带头指针的FP树
(2)从FP树中挖掘(抽取)频繁项集
从FP树中抽取频繁项集的三个基本步骤如下:
- 1)从FP树中获得条件模式基;
- 2)利用条件模式基,构建一个条件FP树;
- 3)迭代重复步骤1步骤2,直到树包含一个元素项为止。
从头指针表中的每个频繁元素项开始,对每个元素项,获得其对应的条件模式基。条件模式基是以所查找元素项为结尾的路径集合(前缀路径)。
频繁项 | 前缀路径 |
z | {}5 |
r | {x,s}1,{z,x,y}1,{z}1 |
x | {z}3,{}1 |
y | {z,x}3 |
s | {z,x,y}2,{x}1 |
t | {z,x,y,s}2,{z,x,y,r}1 |
以频繁项t为例:
元素项s以及rs和r不满足最小支持度的条件,它们并不属于条件FP树。
递归查找频繁项集:
输入:我们有当前数据集的FP树(inTree,headerTable)
1. 初始化一个空列表preFix表示前缀
2. 初始化一个空列表freqItemList接收生成的频繁项集(作为输出)
3. 对headerTable中的每个元素basePat(按计数值由小到大),递归:
1. 初始化一个空列表preFix表示前缀
2. 初始化一个空列表freqItemList接收生成的频繁项集(作为输出)
3. 对headerTable中的每个元素basePat(按计数值由小到大),递归:
- 记basePat + preFix为当前频繁项集newFreqSet
- 将newFreqSet添加到freqItemList中
- 计算的条件FP树(myCondTree、myHead)
- 当条件FP树不为空时,继续下一步;否则退出递归
- 以myCondTree、myHead为新的输入,以newFreqSet为新的preFix,外加freqItemList,递归这个过程
以频繁项t为例:
图中红色加粗的部分即实际添加到freqItemList中的频繁项集。