上一篇我们介绍了Apriori算法,但是我们可以分析得出,Apriori算法可能收到两种非平凡开销的影响:它可能需要产生大量候选项集;它可能需要重复的扫描整个数据库,通过模式匹配检查一个很大的候选集合。检查数据库中每个事务来确定候选项集支持度的开销很大。
是否可以设计一种方法,挖掘全部频繁项集而无须这种代价昂贵的候选产生过程?一种试图这样做的方法称为频繁模式增长(Frequent-Pattern Growth,FP-growth)。它采取如下分治策略:首先,将代表频繁项集的数据库压缩到一颗频繁模式树(FP树),该树仍保留项集的关联信息。然后,把这种压缩后的数据库划分成一组条件数据库,每个数据库关联一个频繁项或模式段,并分别挖掘每个条件数据库。对于每个“模式片段”,只需要考察它相关联数据集。因此,随着被考察的模式的“增长”,这种方法可以显著地压缩被搜索的数据集的大小。
FP-growth算法的基本思路如下:
下面先举例介绍一下FP-grow算法挖掘频繁项集的过程:
事务数据库如下表1:
表1
数据库的第一次扫描与Apriori算法相同,它导出频繁1项集的集合,并得到它们的支持度计数。设最小支持度计数为2.频繁项的集合按支持度计数的递减序排序。结果集或表记为L。这样有L={{I2:7}, {I1:6}, {I3:6}, {I4:2}, {I5:2}}。
然后,FP树构造如下:首先,创建树的根结点,用“null”标记。第二次扫描数据库D。每个事务中的项都按L中的次序处理(即按递减支持度计数排序),并对每个事务创建一个分支。例如,第一个事务"T100:I1, I2, I5"包含三个项(按L中的次序I2、I1、I5),导致构造树的包含三个结点的第一个分支
为了方便树的遍历,创建一个项头表,使每项通过一个结点链指向它在数中的位置。扫描所有的事务后得到的树显示如图1,带有相关的结点链。这样,数据库频繁模式的挖掘问题就转换成挖掘FP树的问题。
图1 存放压缩的频繁模式信息的FP树
FP树的挖掘过程如下:由长度为1的频繁模式(初始后缀模式)开始,构造它的条件模式基(一个“子数据库”,由FP树中与该后缀模式一起出现的前缀路径集组成)。然后,构造它的(条件)FP树,并递归地在该树上进行挖掘。模式增长通过后缀模式与条件FP树产生的频繁模式连接实现。
该FP树的挖掘过程总结在表2中,细节如下。首先考虑I5,它是L中的最后一项,而不是第一项。从表的后端开始的原因随着解释FP树挖掘过程就会清楚。I5出现在图1的FP树的两个分支中。这些分支形成的路径是
表2 通过创建条件(子)模式基挖掘FP树
对于I4,它的两个前缀形成条件模式基{{I2,I1:1},{I2:1}},产生一个单结点的条件FP树
类似于以上分析,I3的条件模式基是{{I2,I1:2},{I2:2},{I1:2}}。它的条件FP树有两个分支
图2 与条件结点I3相关联的FP树
FP-growth方法将发现长频繁模式的问题转换成在较小的条件数据库中递归地搜索一些较短模式,然后连接后缀,它使用最不频繁的项作为后缀,提供了较好的选择性。该方法显著地降低了搜索开销。
FP-growth算法的框架如下:
输入:事务数据库D,最小支持度阈值min_sup,最小
置信度阈值min_conf
输出:强关联规则集合RS
方法:其过程描述如下:
扫描D找出频繁1-项集合L;
L中的项按支持度计数递减排序;
创建FP树的根结点null; //创建FP树
for (D中的每个事务t)
{ 找出t中的频繁1-项集合tt(即删除t中非频繁项得到tt);
将tt中的项按L中的顺序排序;
Insert-FP(tt, null); //创建事务tt的分支
}
LS=Search-FP(FP, null) //找出所有频繁项集
采用前面介绍的产生关联规则算法由LS产生强关联规则集合RS;
构造FP树的算法如下:
算法:Insert-FP算法(tt,root)
输入:已排序频繁1-项集合L,FP(子)树的根结点root
输出:FP树
方法:其描述如下:
if (tt不空)
{ 取出tt中的第1个项i;
if (root的某个子结点Node是i)
Node.sup_count=Node.sup_count+1;
else
{ 创建Tr的子结点Node为i;
Node.sup_count=1;
将Node加入项表链中;
}
从L中删除项i;
Insert-FP(L, Node);
}
对FP-growth方法的性能研究表明,对于挖掘长的频繁模式和短的频繁模式,它都是有效的和可伸缩的,并且大约比Apriori算法快一个数量级。
参考文献:《数据挖掘概念与技术(原书第3版)》