使用FP-growth算法高效发现频繁项集
1. 介绍
FP-growth(Frequent Pattern Tree,频繁模式树)算法是为了解决 Apriori 算法每次增加频繁项集得大小都要遍历整个数据库的缺点,特别是当数据集很大时。FP-growth 算法基于 Apriori 构建,但采用了高级的数据结构减少了扫描次数,加快了算法速度。
FP-growth 算法的任务是:将数据集存储在一个特定的称为 FP 树的结构之后发现频繁项集或者频繁项对,虽然它能够高效地发现频繁项集,但是不能用来发现关联规则,也就是只优化了 Apriori 算法两个功能中的前一个功能。
FP-growth 算法只需要对数据集进行两次扫描,所以即使数据集很大时也不会花费太多的时间在扫描数据集上。该算法发现频繁项集的基本过程如下:
1)构建 FP 树
2)从 FP 树中挖掘频繁项集
2. 算法详解
2.1 FP-growth 的一般流程如下:
- 先扫描一遍数据集,得到频繁项为 1 的项目集,定义最小支持度 min_support(项目出现最少次数),删除掉那些小于最小支持度的项目,然后将原数据集中的条目按项目集降序排列。
- 第二次扫描,创建项头表(从上往下降序),以及 FP 树。
- 对于每一个项目(可以按照从下往上的顺序)找到其条件模式基(CPB,conditional pattern base),递归调用树结构,删除小于最小支持度的项。如果最终呈现单一路径的树结构,则直接列举所有组合;非单一路径的,则继续调用树结构,直到形成单一路径即可。
2.2 示例说明
如下表示的数据清单(第一列为事务 ID,第二列为事务中的元素项):
事务 ID | 事务中的元素项 |
---|---|
1 | r,z,h,j,p |
2 | z,y,x,w,v,u,t,s |
3 | z |
4 | r,x,n,o,s |
5 | y,r,x,z,q,t,p |
6 | y,z,x,e,q,s,t,m |
第一步:构建 FP 树
构建 FP 树是算法的第一步,在 FP 树的基础之上再对频繁项集进行挖掘。为了构建 FP 树,要对数据集扫描两次,对一次对所有元素项出现的次数进行计数,记住:如果一个元素不是频繁的,那么包含该元素的超集也不是频繁的,所以不需要考虑这些超集;第一次扫描只考虑那些频繁项集。
- 扫描数据集,对每个事务进行统计:
r | z | h | j | p | y | x | w | v | u | t | s | n | o | q | e | m |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3 | 5 | 1 | 1 | 2 | 3 | 4 | 1 | 1 | 1 | 3 | 3 | 1 | 1 | 2 | 1 | 1 |
- 假若设定最小支持度(即事务最小出现次数)为 3,删除低于最小支持度的事务,按照降序重新排列数据集:
z | x | y | r | s | t |
---|---|---|---|---|---|
5 | 4 | 3 | 3 | 3 | 3 |
- 根据项目出现次数重新调整事务项:
事务 ID | 事务中的事务项 | 重新排序的事务项 |
---|---|---|
1 | r,z,h,j,p | z,r |
2 | z,y,x,w,v,u,t,s | z,x,y,s,t |
3 | z | z |
4 | r,x,n,o,s | x,s,r |
5 | y,r,x,z,q,t,p | z,x,y,r,t |
6 | y,z,x,e,q,s,t,m | z,x,y,s,t |
- 构建 FP 树
依次加入各条清单{(z,r),(z,x,y,s,t),…,(z,x,y,s,t)},出现相同的节点进行累加,最终得到 FP 树:
第二步:从 FP 树中挖掘频繁项集
从 FP 树中抽取频繁项集的三个基本步骤:
1)从 FP 树中获得条件模式基;
2)利用条件模式基,构建一个条件FP树;
3)迭代重复步骤1)、2)直到树只包含一个元素项为止。
1)抽取条件模式基
首先从头指针表中的每个频繁元素项开始,对每个元素项,获得其对应的条件模式基(conditional pattern base)。条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前缀路径(prefix path)。简而言之,一条前缀路径是介于所查找元素项与树根节点之间的所有内容。
则每一个频繁元素项的所有前缀路径(条件模式基)为:
频繁项 | 前缀路径(条件模式基) |
---|---|
z | {}:5 |
x | {z}:3,{}:1 |
y | {z,x}:3 |
s | {z,x,y}:2,{x}:1 |
r | {z,x,y}:1,{x,s}:1,{z}:1 |
t | {z,x,y,s}:2,{z,x,y,r}:1 |
2)构建条件 FP 树
按照从下往上的顺序,对于每一个频繁项,根据其条件模式基,创建一棵条件 FP 树,然后根据最小支持度删除一些节点,最后得到该元素的频繁项集。
例如,对于 t,根据其条件模式基 {z,x,y,s}:2,{z,x,y,r}:1,构造条件 FP 树如下,删除小于支持度的节点:
3)递归查找频繁项集
上例形成单路径后,元素 t 与其条件 FP 树中各元素进行组合,得到 t 的频繁项集:{ {tz:3},{tx:3},{ty:3},{tzx:3},{tzy:3},{txy:3},{tzxy:3} }。
接下来考虑其他元素,依照上述方法执行,即可得到每个元素的频繁项集。
整个过程如下图:
根据 FP-growth 算法,最终得到的支持度不小于3的频繁项集如下:
item | 条件模式基 | 条件 FP 树 | 产生的频繁项集 |
---|---|---|---|
z | {}:5 | {} | {z:5} |
x | {z:3},{}:1 | {z:3} | {x:4},{x,z:3} |
y | {z,x:3} | {z:3,x:3} | {y:3},{y,z:3},{y,x:3},{y,z,x:3} |
s | {z,x,y:2},{x:1} | {x:3} | {s:3},{s,x:3} |
r | {z,x,y:1},{x,s:1},{z:1} | {} | {r:3} |
t | {z,x,y,s:2},{z,x,y,r:1} | {z:3,x:3,y:3} | {t:3},{t,z:3},{t,x:3},{t,y:3},{t,z,x:3},{t,z,y:3},{t,x,y:3},{t,z,x,y:3} |
注意:当条件 FP 树不是单一路径时,则需要递归查找频繁项集。
举例:如果某节点 I3,得到其条件模式基 {I2,I1:3}、{I2:1}、{I1:3} 构造条件 FP 树,由于此树不是单一路径,因此需要递归挖掘 I3。,递归考虑 I3,此时得到 I1 的条件模式基 {I2:2},即 I1I3 的条件模式基为 {I2:2},构造条件 FP 树,由此得到节点 I3 的频繁项目集 {I3:6},{{I3,I2:4},{I3,I1:6},{I2,I1,I3:3}}。