第12章 使用FP-growth算法来高效发现频繁项集(代码)
-
FP
-
优点
因为 FP-growth 算法只需要对数据集遍历两次,所以速度更快。
FP树将集合按照支持度降序排序,不同路径如果有相同前缀路径共用存储空间,使得数据得到了压缩。
不需要生成候选集。
比Apriori更快。
-
缺点
FP-Tree第二次遍历会存储很多中间过程的值,会占用很多内存。
构建FP-Tree是比较昂贵的。
-
适用数据类型
- 标称型数据(离散型数据)。
FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法,他与Apriori算法一样也是用来挖掘频繁项集的,不过不同的是,FP-Tree算法是Apriori算法的优化处理,他解决了Apriori算法在过程中会产生大量的候选集的问题,而FP-Tree算法则是发现频繁模式而不产生候选集。但是频繁模式挖掘出来后,产生关联规则的步骤还是和Apriori是一样的。
-
创建FP树步骤
创建根节点,用NULL标记。
统计所有的事务数据,统计事务中各个类型项的总支持度(在下面的例子中就是各个商品ID的总个数)
依次读取每条事务,比如T1, 1, 2, 5,因为按照总支持度计数数量降序排列,输入的数据顺序就是2, 1, 5,然后挂到根节点上。
-依次读取后面的事务,并以同样的方式加入的FP树中,顺着根节点路径添加,并更新节点上的支持度计数。
-
-
Fp树的数据挖掘
由长度为1 的频繁模式开始,构造他的条件模式基(一个“子数据库”,由FP树中与后缀模式一起出现的前缀路径集组成)。
构造该初始后缀模式的条件FP树,并递归的在该树上实现挖掘。模式增长通过后缀模式与条件FP树产生的频繁模式连接实现。
-
Fp树性质
(结点链性质)对于任何频繁项ia,从FP-tree的头表对应ia项的头指针(headof node_link)开始,通过遍历ia的结点链(node_link)可以挖掘出所有包含ia的频繁模式。
(前缀路径性质)为了计算以ia为后缀的频繁模式,仅仅需要在FP-tree中计算ia结点的前缀路径,并且前缀路径中每个结点的频繁计数等于ia结点的频繁计数。
(分段增长)设α为事务数据库D中的一个项集,B是α的条件模式基,而β是B中的一个项集,那么在D中α∪β的支持度等于B中β的支持度。
(模式增长)设项α为事务数据D中的一个项集,B是α的条件模式基,13而β是B中的一个项集,那么α∪β为频繁项集的充分必要条件是β也为频繁项集。
(单路径频繁项集产生)如果FP-treeT包含一条单路径P,那么T包含的所有频繁项集的集合可以通过枚举路径P中结点的所有可能组合得到,其支持度计数为组合中结点的支持度计数的最小值。
给定一个事务数据库D,最小支持度阈值minσ和频繁项头表=<……>nLi,i,,i12。挖掘频繁闭项集的问题可以分解为n个子问题:第j(1≤j≤n)个子问题是找到所有包含ijn+1?但不包含i(n1jkn)k+?<≤的频繁闭项集。
可以看出,后挖掘到的频繁闭项集不可能包含先前找到的频繁闭项集,但是它可能被已有的一个频繁闭项集所包含,因此在挖掘过程中要对新挖掘的候选频繁闭项集进行检验。如果刚得到的候选频繁闭项集X不是已有的一个频繁闭项集的子集或者两者的支持度不同,那么就说X通过了FCI超集检测,是一个频繁闭项集。如果X是一个频繁闭项集,那么在X的条件模式基中不存在任何一个项i出现在每一个事务中。
如果Y是一个最大项集合(Y满足:出现在X的条件模式基的每一个事务中,但Y的直接超集不满足这一性质),并且X∪Y通过了FCI超集检测,那么X∪Y是一个频繁闭项集。
-
单路径候选频繁闭项集:设i是X的条件模式基中的一个频繁项目,如果X的条件模式树中只有一个结点N标记为i,并且N的所有祖先结点只有一个子女,N若满足下列三个条件之一:
N没有子女。
N有两个以上的子女。
-
N有一个子女,它的支持度计数小于N的。
那么单路径候选频繁闭项集就是X∪Z,Z包含N和N的祖先(除根结点)。如果条件模式X的条件FP-tree存在单路径,在单路径中提取候选频繁闭项集的个数为单路径中具有不等的频度个数。
对单路径候选频繁闭项集Y,如果Y通过了FCI超集检测,则Y是一个频繁闭项集。
X和Y是两个频繁项集且具有相同的支持度。如果X?Y且Y是闭项集,那么不存在只包含X不包含Y?X的频繁闭项集。
-
小节
FP算法是一种用于发现数据集中频繁模式有效的办法
FP树构建完成之后,可以通过查找元素项的条件基于及构建条件FP树来发现频繁项集
该过程不断以更多元素作为条件重复执行,直到FP树中只包含了一个元素为止