数据挖掘——关联规则算法之FP-tree
前言
Apriori算法需要生成大量的候选集而且需要进行多次的扫描,对于那些大数据量的数据集很耗费时间。基于此问题,FP-tree算法不用生成候选集,只进行两次数据库扫描。简单来说是尽可能少得读取数据,尽可能的对读取到的数据进行压缩,属于空间换时间的算法。
FP-tree算法
FP-tree没有候选集,直接压缩数据库成一个频繁模式,通过这棵树生成关联规则。
FP-tree的具体步骤:
步骤一、构造FP-tree:
(1)扫描数据库一次,得到频繁项集1项集;
(2)把项按支持度递减排序;
(3)再一次扫描数据库,建立FP-tree。
步骤二、频繁模式的挖掘:
根据事务数据库D和最小支持度min_sup,调用建树过程建立FP-tree;
if(FP-tree为简单路径):
将路径上支持度计数大于等于min_sup的节点任意组合,得到所需的频繁模式;
else:
初始化最大频繁模式集合为空;
按照支持频率升序,以每个1频繁项为后缀,调用挖掘算法挖掘最大频繁模式集;
根据最大频繁模式集合中最大频繁式,输出全部的频繁模式。
上面的过程看的云里雾里,下面来个例子来学习FP-tree:
举例:
事务数据库如下:
Tid | Items |
---|---|
1 | a,b,e |
2 | b,d |
3 | b,c |
4 | a,b,d |
5 | a,c |
6 | b,c |
7 | a,b |
8 | a,b,c,e |
9 | a,b,c |
那么按照上面说的步骤来处理上表的数据库:
步骤一:
1、扫描事务数据库得到频繁项集1项集F(每个项出现的次数):
a | b | c | d | e |
---|---|---|---|---|
6 | 7 | 6 | 2 | 2 |
2、定义min_sup = 20%,即最小支持度为2,此时每一项最少出现
9
∗
0.2
≈
2
9 * 0.2 \approx 2
9∗0.2≈2次;
3、重新排列1项集F,把项按照支持度递减排序:
b | a | c | d | e |
---|---|---|---|---|
7 | 6 | 6 | 2 | 2 |
4、重新调整事务数据库,使每一个事务中的项按照频次递减的顺序排列:
Tid | Items |
---|---|
1 | b,a,e |
2 | b,d |
3 | b,c |
4 | b,a,d |
5 | a,c |
6 | b,c |
7 | a,b |
8 | b,a,c,e |
9 | b,a,c |
这块需要注意,FP-tree算法不是先把上面的这个整张表排序好再去生成树,而是每排序好一个事务就构建一个树。下面说明怎样建立树。
5、创建根节点和频繁项目表
(1)创建根节点:
(2)加入第一个事务(b,a,e)
(3)加入第二个事务(b,d)
(4)加入第三个事务(b,c):
(5)加入第四个事务(b,a,d)
(6)按照上面的算法,直到加入第九个事务(b,a,c):
步骤二:
(1)此时按照支持度从小到大的顺序来挖掘。首先考虑e,得到条件模式基(简单理解就是以e为节点的所有路径分支), 同时把其经过的节点的个数设置为1(为什么设置为1?因为对于节点e来说,b和a对e只贡献一次作用,其他类似)
<b,a:1>、<b,a,c:1>
(2)利用上面得到的条件模式基,在此构建条件FP-tree:
(3)敲黑板了!!!这块不好理解!!!前面已经声明了最小支持度是2,然后上面由e得到的tree中c的支持度1是小于2的 ,所以和e结合起来也达不到支持度2,所以去掉:
那么剩下的b和a是满足要求的,他们与e结合起来可以有如下(两两组合)的三个频繁项集:
{b,e:2},{a,e:2},{b,a,e:2}
(4)按照递增的顺序,接下来该处理d了,其条件模式基:
<b,a:1>,<b:1>
那么构造d的FP-tree:
同样,a的支持度小于2,剔除,那么其tree如下:
得到d的频繁项集:
{b,d:2}
(5)考虑c,得到其条件模式基:
<b,a:2>,<b:2>,<a:2>
同样构造FP-tree:
注意:此树与上面的树都不同,此树不是单一路径的,因此需要递归挖掘c。
1)从a开始,考虑a,a的条件模式基<b:2>,构造a的条件FP-tree:
一定要转过来这个弯哈,因为这是递归的,该步得到的结构应该计入到5)里面,所以得c的频繁项集{b,c:4},{a,c:4},{b,a,c:2}
(6)考虑a(这不是上面递归里面的a) ,其条件模式基<b:4>
得a的频繁项集{b,a:4}。
FP-tree的优缺点
FP-tree结构的好处:
(1)完备:不会打破交易中的任何模式;包含了频繁模式挖掘所需的全部信息
(2)紧密:去除不相关信息(不包含非频繁项集);支持度降序排列,支持高的项在FP-tree中共享的机会也高;绝不会比原数据库大(如果不计算树节点的额外开销)。
优点:
- FP-tree算法只需对事物数据库进行两次扫描;
- 避免产生大量候选集
缺点:
- 要递归生成条件数据库和条件FP-tree,所需内存开销大;
- 只能用于挖掘单维的布尔关联规则