FP树算法简介
FP树(Frequency Pattern Tree)算法是一种用于挖掘频繁项集的算法,它通过构建一种特殊的数据结构来压缩数据库中的信息,从而加快频繁项集的挖掘过程。
FP-growth算法只需要对数据集进行两次遍历。而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定的模式是否频繁,因此FP-growth算法要比Apriori算法快。
下面是FP树算法的详细解析:
FP树算法步骤
步骤1:收集频繁项集
- 遍历数据集项:遍历数据集中的所有项,计算每个项的支持度(即出现次数)。
- 筛选频繁项集:根据用户指定的最小支持度阈值,筛选出频繁项集。
例如,假设我们有一个超市的交易数据集,我们想要找出顾客经常一起购买的商品组合。如果我们设置最小支持度阈值为5%,那么只有那些在至少5%的交易中出现的商品组合才会被认为是频繁项集。
假设我们有以下事务数据集(每个T可以理解为超市每次购物的订单,以及其中的物品):
T1 = {r, z, h, j, p}
T2 = {z, y, x, w, v, u, t, s}
T3 = {z}
T4 = {r, x, n, o, s}
T5 = {y, r, x, z, q, t, p}
我们设置最小支持度为3(即一个项至少在3个事务中出现)。根据这个阈值,我们筛选出频繁项集:{r:4, z:5, x:4, y:3, p:3}。
步骤2:构建FP树
- 初始化FP树:创建一个空树,树的根节点记为null。
- 第二次扫描数据集:再次遍历数据集中的所有事务。
- 重排事务中的项:对于每个数据集,按照频繁项集的顺序重排事务中的项。
- 插入事务到FP树:将重排后的事务插入到FP树中。如果树中已经存在相同的路径,则增加该路径的计数;否则,创建新的路径。
- 更新头表:头表是一个用于快速访问FP树中相同项的指针列表。在插入事务时,更新头表中的指针。
我们按照上例频繁项集的顺序重排每个事务中的项,并插入到FP树中。
这里,我们来展示如何将事务插入到FP树中。
事务数据库:
T1 = {r, z, h, j, p}
T2 = {z, y, x, w, v, u, t, s}
T3 = {z}
T4 = {r, x, n, o, s}
T5 = {y, r, x, z, q, t, p}
频繁项集和支持度:
{r:4, z:5, x:4, y:3}
我们设置最小支持度为3,并根据支持度降序排列频繁项集的顺序为:z, r, x, y
。
现在,我们将按照这个顺序重排每个事务中的项,并插入到FP树中。我们从一个空的FP树开始:
FP树初始状态:
null
接下来,我们逐个插入重排后的事务到FP树中:
-
重排并插入T1:
{z, r, h, j, p}
→{z, r}
(去掉不频繁的项,并按照频繁项集的顺序排序)- 插入z:创建新的节点z,计数为1
- 插入r:创建新的节点r,计数为1
FP树更新为:
null | z(1) | r(1)
-
重排并插入T2:
{z, y, x, w, v, u, t, s}
→{z, x, y}
- 插入z:增加现有节点z的计数到2
- 插入x:创建新的节点x,计数为1
- 插入y:创建新的节点y,计数为1
FP树更新为:
null | z(2) | \ r(1) x(1) | y(1)
-
重排并插入T3:
{z}
→{z}
- 插入z:增加现有节点z的计数到3
FP树更新为:
null | z(3) | \ r(1) x(1) | y(1)
- 插入z:增加现有节点z的计数到3
-
重排并插入T4:
{r, x, n, o, s}
→{r, x}
- 插入r:增加现有节点r的计数到2
- 插入x:增加现有节点x的计数到2
FP树更新为:
null / \ z(3) r(1) | \ | r(1) x(1) x(1) | y(1)
-
重排并插入T5:
{y, r, x, z, q, t, p}
→{z, r, x, y}
- 插入z:增加现有节点z的计数到4
- 插入r:增加现有节点r的计数到3
- 插入x:增加现有节点x的计数到3
- 插入y:增加现有节点y的计数到2
FP树最终更新为:
null / \ z(4) r(1) | \ | r(2) x(1) x(1) | | x(1) y(1) | y(1)
这样,我们就完成了所有事务的插入。FP树的每个节点都包含一个项和一个计数,计数表示该路径上该项的出现次数。节点之间的链接表示事务中项的顺序。通过这种方式,FP树能够有效地表示数据库中的频繁模式,并用于后续的频繁项集挖掘。
步骤3:挖掘频繁项集
- 从头表中的底部项开始挖掘:从头表的底部项开始,挖掘它的条件模式基。
- 构建条件FP树:对于每个频繁项,根据其条件模式基构建条件FP树。
- 递归挖掘:递归地挖掘条件FP树中的频繁项集,直到找不到频繁项集为止。
从FP树中挖掘频繁项集的过程如下:
- 频繁项“z”:
- 条件模式基:{}5
- 构建条件FP树,并递归挖掘。
- 频繁项“r”:
- 条件模式基:{z}2,{}3
- 构建条件FP树,并递归挖掘。
- 频繁项“x”:
- 条件模式基:{z,r}1,{r}2,{z}2
- 构建条件FP树,并递归挖掘。
- 频繁项“y”:
- 条件模式基:{z,r,x}1,{z,x}2
- 构建条件FP树,并递归挖掘。
通过这种方式,FP树算法可以高效地挖掘出数据库中的频繁项集。FP树算法在大数据集上的优势在于它的压缩技术和减少数据库扫描次数的能力,这使得它非常适合处理大规模数据挖掘任务。