本文内容转自:http://blog.csdn.net/lmm2003/article/details/6882299
关于FP树自己的理解
频繁模式增长(frequent-pattern growth) 简称FP增长
准备工作:
1,扫描数据库,导出频繁项(1项集),保留频繁1项集的计数 (不是频繁1项集的项不含于任何k项频繁集---子集的模小于自身), 其他项集不予考虑。
2,对频繁1项集按降序排列 (一个准备工作而已) 构成一个头表
FP树的构造方法:
根节点设为 null节点,一个特殊的实体节点。
再次扫描数据库,对于任一条记录
其元素按照头表中项集的顺序重新排列(I1,I2,....In)。仅为了计算方便而已
记录项(1,2,3.....n)构成一条链(可以实体化为一条物理链条),按以下方法链接到null 节点上:(本质上是把链一条条添到null中,相同的链段覆盖在一起,不同的不覆盖在一起)
FP树构造完毕
FP树和物理的链堆一一对应,若元素不按照头表项集降序排列,则构造的物理链是杂乱无章的(只是计算很复杂)而已。把物理链扁平化后即得FP树。
不使用null节点,构造的可能为一个森林。
FP树可以反映的内容:
任意K项集均可在FP树中找到:任意K项集,某次出现属于一条记录,对应一条链,他的大小为链的个数,因为FP树与物理链一一对应,可从FP树中求得任意K项集的计数。从FP树的根节点到任意节点的路径,是同是出现路径上节点项的记录,计数值为路径尾节点计数值。
当元素按表头降序排列时,链的计数相当方便。
我们的目标是从FP树中挖掘所有的频繁项集
从FP树中挖掘所有的频繁项集
算法理论准备:
无序性:集合中的元素的排列顺序无先后之分;元素相同而排列顺序不同的集合是相等的集合。
频繁项集的等价转化(方便用数学的方法不重复的确定唯一的一个集合):虽然集合是无序的,但一个频繁项集一一对应一个有序(即按频繁项出现次数多少的顺序)的频繁项串,因此我们认为一个有序的频繁项串等价于一个频繁项集。求出所有的有序频繁项串,也就求出了所有频繁项集。
项集=有序项串1+有序项串2 以相同“有序项串2”结尾的频繁项集构成一个集合。
有序项串2 定义为后缀模式,后缀模式在FP树中对应多条局部路径。 我们只考虑FP树中频繁项集的可能的后缀模式(即后缀模式的计数值要大于support值,包含后缀模式的记录,均对应FP树中的到达后缀模式的路径。因此,求出所有的路径并计数(计数值为该路径中后缀模式的尾节点计数值),这种路径成为条件模式基。因此条件模式基的任意组合U后缀模式,为所有包含后缀模式的可能的频繁项集。(FP树的单个项满足support,但因为单个项可能分散在不同的路径中,导致并不是所有的前缀路径满足support值),其中前缀路径可以作为一个各节点计数值为该路径计数值的链条,构成一个FP树,但此时FP树可以进一布优化,因为我们的目的是从FP树中求所有包含后缀模式的频繁项串,但那些统计小于support值的节点,显然对频繁项串记录没有任何贡献,以这些节点起始的路径可以从FP中删去,因为是按降序排列的,后面的节点自然也小于support,删去路径没关系,注后缀并不出现在条件FP树中。从而生成条件FP树。此时,若条件FP树不为空,则递归下去(则条件FP树中各路径的任意组合U后缀模式,均为频繁项集,算法中只用到一点即FPtree中的任意节点U后缀模式均为频繁项集)。
所有的频繁项集可以安以下类型划分为不相交的集合,{以Ik为后缀模式的 频繁项串| ik属于FP_tree} 的集合,该集合的中所有元素的前缀可以通过一组“基”来构造,这个基,成为条件模式基,进而构成条件模式。
FP_growth算法的设计
动态规划的设计思想
FP_growth(FPTree,a)是一个递归的过程,这个过程在结果中添加FPTree中以a(一个有序的频繁项串)结尾的有序频繁项串
因此初始调用是FP_growth(FPTree,null),即返回FPTree中所有(以a=null 结尾)有序频繁项串。对FP树的链尾进行null扩展,计数=链尾。
我们递归地求FP_growth(FPTree,a):
递归终点:FPTree为单链的时候,如果a的前缀为一条单链,则单链中项集同时出现的次数=a出现的次数>=support参照代码
递归过程:FPTree不是单链的时候,把以a结尾的有序频繁项串集合进行如下划分:U{a}U分别以i1a,i2a......ina结尾的频繁项串组成的集合,i1,i2.....in是FPTree中出现的节点,按照这种思路,分别构造ia的条件FPTreei(条件FPTreei也是FPTree),因此循环调用FP_growth(FPTreei,ia)即可。
初始的FP_tree 和条件FP_tree都满足一条性质:即FP_tree中的任一节点U后缀,均为频繁项集。
FP_growth算法的实现
procedure FP_growth(Tree, a) {// FP_growth 为从Tree(a)中,寻找后缀为a的频繁项集的集合(a为频繁项集)
if Tree 含单个路径P then{
for 路径P 中结点的每个组合(记作b)
产生模式b U a,其支持度support = b 中结点的最小支持度;
}
else {
for each a i 在Tree的头部{ //第一次时对每一项集的条件FP树后进行模式增长生成,
产生一个模式b = a i U a,其支持度support = a i .support;aj<=a的support的,:-)
构造b的条件模式基,然后构造b的条件FP-树Treeb;
if Treeb 不为空 then
调用 FP_growth (Treeb, b);
}
}