首页 理论教育基于FP-growth的频繁项集挖掘算法

基于FP-growth的频繁项集挖掘算法

【摘要】:在借助数据结构存放中间结果来挖掘关联规则的算法中,FP-growth算法[89]效率较高,其中使用的树结构FP-Tree成为很多研究的基础。通过递归调用FP-growth的方法来直接产生频繁项目集。为方便后面叙述,表2.1中在第3列列出了每个事务中按降序排列的频繁项。第二次扫描数据库并构建FP-Tree。图2.6[例2.1]生成的FP-TreeFP-Tree的构造算法如图2.7所示。FP-growth算法以FP-Tree头表的倒序为计算顺序,从下至上递归搜索FP-Tree,逐步生成所有的频繁项集。图2.7FP-Tree的构造算法图2.8FP-growth算法

在借助数据结构存放中间结果来挖掘关联规则的算法中,FP-growth算法[89]效率较高,其中使用的树结构FP-Tree成为很多研究的基础。算法的重点还是在挖掘频繁项集的过程,分为两部分:

(1)通过两次扫描事务数据库,把每个事务所包含的频繁项目按其支持度降序压缩存储到FP-Tree中。

(2)通过递归调用FP-growth的方法来直接产生频繁项目集。这个过程不需要再扫描事务数据库,而仅在FP-Tree中进行查找即可,在整个发现过程中也不需产生候选项目集。

FP-Tree由两部分构成:头表和树。头表中节点由itemname、count和node_link 3个域组成,分别标识项目名、支持数和指向树中第一个同名节点的指针。树中节点由itemname、count、parent_link、node_link 4个域组成,分别标识项目名、计数、父节点的指针和指向树中下一同名节点的指针。通过以下例子来说明FP-Tree的构造过程。

【例2.1】(见文献[89]中的[例3.1]):设有如表2.1所示的前两列事务数据库。令最小支持数为3。则FP-Tree的构造过程如下:

表2.1 示例事务数据库

(1)访问一次数据库,找出所有频繁1-项集,并按支持数降序排列,结果为:<(f:4),(c:4),(a:3),(b:3),(m:3),(p:3)>(“:”后面表示项目的支持数)。生成头表中的项,并将每项后的指针初始化为“null”。为方便后面叙述,表2.1中在第3列列出了每个事务中按降序排列的频繁项(Frequent items)。

(2)创建树的根节点并标记为null。第二次扫描数据库并构建FP-Tree。

取到第1个事务;析出其中的频繁项;降序排列;在根下创建树的第一个分支:<(f:1),(c:1),(a:1),(m:1),(p:1)>。

取到第2个事务;析出其中的频繁项;降序排列<f,c,a,b,m>。因为其前3项<f,c,a>与现在树中第一个分支的前3个节点重复,只需在树中把这3个节点的计数分别加1变成<(f:2),(c:2),(a:2)>;再给节点<(a:2)>增加一个子分支<(b:1),(m:1)>。

取到第3个事务;析出其中的频繁项;降序排列<f,b>。因为其第一项<f>与现在树中第一个分支的前一个<(f:2)>节点重复,只需树中把这3个节点的计数分别加1变成<(f:3)>;再给节点<(f:3)>增加一个子分支<(b:1)>。

取到第4个事务;析出其中的频繁项;降序排列<c,b,p>。因为其与现在树中的分支没有前端重复,所以给根节点增加一个子分支<(c:1),(b:1),(p:1)>。

取到第5个事务;析出其中的频繁项;降序排列<f,c,a,m,p>。因为其与现在树中最左分支完全重复,所以只需给这个分支的每个节点的计数加1,变为:<(f:4),(c:3),(a:3),(m:2),(p:2)>。

这个过程中随时将各新生成节点与头表中相应的项进行链接。最后生成的FP-Tree如图2.6所示。

图2.6 [例2.1]生成的FP-Tree

FP-Tree的构造算法如图2.7所示。

可以看出,通过两次访问数据库,所有频繁项目的信息被存放到FP-Tree中。FP-growth算法以FP-Tree头表的倒序为计算顺序,从下至上递归搜索FP-Tree,逐步生成所有的频繁项集。其算法如图2.8所示。

FP-Tree在不损失事务信息的情况下,有效地压缩了数据库中数据,是迄今为止提出的较有效的数据结构,目前有许多研究都是基于这个结构的。

图2.7 FP-Tree的构造算法

图2.8 FP-growth算法