一、FP-growth 概述
FP-Growth(Frequent Pattern Growth,频繁模式增长)算法是一种高效的数据挖掘算法,主要用于解决频繁项集挖掘和关联规则发现的问题。
与传统的Apriori算法相比,FP-Growth算法通过构建一种称为FP-Tree(频繁模式树)的数据结构,极大地减少了搜索空间,提高了挖掘效率。
FP-Growth算法不仅适用于处理大规模数据集,还能有效应对数据稀疏性问题,因此在电子商务、社交网络分析、金融风控等多个领域有着广泛的应用。
FP-Growth算法 | Apriori算法 | |
提出时间 | 2000年 | 1993年 |
基本思想 | 基于频繁模式树(FP-Tree)挖掘频繁项集 | 基于候选集生成和向下封闭检测挖掘频繁项集 |
数据结构 | FP-Tree(频繁模式树) | 无特定数据结构,使用集合和列表 |
扫描数据库次数 | 两次 | 多次(随频繁项集长度的增加而增加) |
效率 | 较高,特别是对于大规模数据集 | 较低,特别是对于长频繁项集 |
内存使用 | 较低,因为FP-Tree是紧凑的数据结构 | 较高,因为需要存储大量候选集 |
算法复杂度 | 较低,构建FP-Tree和挖掘频繁项集过程相对简单 | 较高,尤其是候选集生成和剪枝过程 |
适应场景 | 适用于大规模数据集和稀疏数据集 | 适用于小规模数据集或特定场景 |
发现关联规则 | 需要额外步骤从频繁项集中生成关联规则 | 可以直接从频繁项集中生成关联规则 |
优点 | 1. 只需扫描数据库两次,效率高。2. 占用内存少。3. 适用于大规模数据集。 | 1. 算法简单明了,易于实现。2. 广泛应用于各个领域。 |
缺点 | 不能直接用于发现关联规则,需要额外步骤 | 1. 扫描数据库次数多,效率低。 2. 产生大量候选集,占用内存大。 3. 对于长频繁项集挖掘性能低下。 |
二、FP-Growth实现原理
假设你的超市有以下几笔交易记录(即顾客购买的商品列表):
- 交易1: 牛奶, 面包, 尿布
- 交易2: 面包, 尿布, 啤酒, 鸡蛋
- 交易3: 牛奶, 尿布, 啤酒, 可乐
- 交易4: 面包, 牛奶, 尿布, 可乐
步骤1:构建FP树
- 统计频率:数据库的第一次扫描与Apriori算法相同,它导出频繁项(1项集)的集合,并得到它们的支持度计数(频度)。
商品 | 支持度 |
尿布 | 4 |
面包 | 3 |
牛奶 | 3 |
啤酒 | 2 |
可乐 | 2 |
鸡蛋 | 1 |
- 排序和过滤:假设我们设定最小支持度为2,根据统计的支持度,对每笔交易中的商品进行排序(通常按支持度降序),并删除非频繁项。
商品 | 支持度 |
尿布 | 4 |
面包 | 3 |
牛奶 | 3 |
啤酒 | 2 |
可乐 | 2 |
- 构建FP树:
- 创建一个根节点(通常标记为“null”或“root”)
- 对于每笔过滤后的交易,按照排序后的顺序插入到FP树中。如果树中已存在某个节点,则增加其计数;如果不存在,则创建新节点(构造FP树时,会排查非频繁项)。
步骤2:挖掘频繁项集
在FP树构建完成后,数据库频繁模式的挖掘问题就转换成挖掘 FP树的问题。算法会递归地从树中挖掘频繁项集。
- 从树底开始:从FP树的底部(即叶子节点)开始,对每个节点,找到其条件模式基(即包含该节点的所有前缀路径)。
- 构建条件FP树:基于条件模式基,为每个节点构建一个条件FP树。这个新树只包含与当前节点一起出现的项。
- 递归挖掘:对每个条件FP树,重复上述过程,直到找到所有频繁项集。
通过创建条件(子)模式基挖据 FP树
商品 | 条件模式基 | 条件FP树 | 产生的频繁模式 |
可乐 | {{尿布,面包,牛奶:1},{尿布,牛奶,啤酒:1} | <尿布,牛奶:2> | {尿布,牛奶,可乐:2},{尿布,可乐:2},{牛奶,可乐:2} |
牛奶 | {{尿布,面包:2},{尿布:1}} | <尿布,面包:2>,<尿布:3>,<面包:2> | {尿布,面包,牛奶:2},{尿布,牛奶:3},{面包,牛奶:2} |
啤酒 | {{尿布,面包:1},{尿布,牛奶:1}} | <尿布:2> | {尿布,啤酒:2} |
面包 | {{尿布:3}} | <尿布:3> | {尿布,面包:3} |
最后,产生的频繁模式为表中最后一列的数据加上1-频繁项集的集合。