关于FP树自己的理解
频繁模式增长(frequen-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树中挖掘所有的频繁项集
算法理论准备:
所有的频繁项集可以安以下类型划分为不相交的集合,{以Ik为后缀模式的 频繁项串| ik属于FP_tree} 的集合,该集合的中所有元素的前缀可以通过一组“基”来构造,这个基,成为条件模式基,进而构成条件模式。
FP_growth算法的设计
因此初始调用是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_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);
}
}
FP算法的优缺点