标签:关联分析 频繁项集 fp-tree fp-growth
在关联分析中,频繁项集的挖掘最常用到的就是Apriori算法。Apriori算法是一种先产生候选项集再检验是否频繁的“产生-测试”的方法。这种方法有种弊端:当数据集很大的时候,需要不断扫描数据集造成运行效率很低。
而FP-Growth算法就很好地解决了这个问题。它的思路是把数据集中的事务映射到一棵FP-Tree上面,再根据这棵树找出频繁项集。FP-Tree的构建过程只需要扫描两次数据集。
更多关联分析和Apriori算法的信息请见:什么是关联分析、Apriori算法的介绍。
我们还是用购物篮的数据:
TID Items 001 Cola, Egg, Ham 002 Cola, Diaper, Beer 003 Cola, Diaper, Beer, Ham 004 Diaper, Beer TID代表交易流水号,Items代表一次交易的商品。
首先,FP-Growth算法的任务是找出数据集中的频繁项集。
然后,FP-Growth算法的步骤,大体上可以分成两步:(1)FP-Tree的构建; (2)FP-Tree上频繁项集的挖掘。
构造FP-Tree的伪代码如下:
算法:FP-Tree构造算法
输入:事务数据集 D,最小支持度阈值 min_sup
输出:FP-Tree
(1) 扫描事务数据集 D 一次,获得频繁项的集合 F 和其中每个频繁项的支持度。对 F 中的所有频繁项按其支持度进行降序排序,结果为频繁项表 L ;
(2) 创建一个 FP-Tree 的根节点 T,标记为“null”;
(3) for 事务数据集 D 中每个事务 Trans do
(4) 对 Trans 中的所有频繁项按照 L 中的次序排序;
(5) 对排序后的频繁项表以 [p|P] 格式表示,其中 p 是第一个元素,而 P 是频繁项表中除去 p 后剩余元素组成的项表;
(6) 调用函数 insert_tree( [p|P], T );
(7) end for
insert_tree( [p|P], root)
(1) if root 有孩子节点 N and N.item-name=p.item-name then
(2) N.count++;
(3) Else
(4) 创建新节点 N;
(5) N.item-name=p.item-name;
(6) N.count++;
(7) p.parent=root;
(8) 将 N.node-link 指向树中与它同项目名的节点;
(9) end if
(10) if P 非空 then
(11) 把 P 的第一项目赋值给 p,并把它从 P 中删除;
(12) 递归调用 insert_tree( [p|P], N);
(13) end if
这一步骤稍微比较难理解一点,求解以某个项为后缀的频繁项集分成两步:找出它的条件模式基;根据条件模式基构造它的条件FP-树。出现了几个新名词,下面直接针对购物篮的FP-Tree进行讲解吧。
求以“Ham”为后缀的频繁项集:
求以“Beer”为后缀的频繁项集:
求以“Diaper”为后缀的频繁项集:
条件模式基为{(Cola:2)},最后求得频繁项集为{Cola Diaper:2}。
综上,得到的频繁项集有:{Cola Ham:2}、{Cola Beer:2}、{Diaper Beer:2}、{Cola Diaper:2}、{Cola Diaper Beer:2}。
从FP-Tree提取频繁项集的伪代码如下:
算法:FP-Growth(FP-Tree,
α );
输入:已经构造好的 FP-Tree,项集α (初值为空),最小支持度 min_sup;
输出:事务数据集 D 中的频繁项集 L;
(1) L 初值为空
(2) if Tree 只包含单个路径 P then
(3) for 路径 P 中节点的每个组合(记为β ) do
(4) 产生项目集α∪β ,其支持度 support 等于β 中节点的最小支持度数;
(5) return L = L∪ 支持度数大于 min_sup 的项目集β∪α
(6) else //包含多个路径
(7) for Tree 的头表中的每个频繁项αf do
(8) 产生一个项目集β =αf∪α ,其支持度等于αf 的支持度;
(9) 构造β 的条件模式基 B,并根据该条件模式基 B 构造β 的条件 FP- 树Treeβ ;
(10) ifTreeβ≠Φ then
(11) 递归调用 FP-Growth(Treeβ ,β );
(12) end if
(13) end for
(14) end if
(15) 产生一个模式β =ai∪α , 其支持度 support =ai .support;
(16) 构造β 的条件模式基,然后构造β 的条件 FP-树Treeβ ;
(17) ifTreeβ≠Φ then
(18) 调用 FP-Growth(Treeβ ,β );
(19) }
标签:关联分析 频繁项集 fp-tree fp-growth
原文地址:http://blog.csdn.net/bone_ace/article/details/46669699