FP增长(发现频繁相集而不产生候选)

关于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树中挖掘所有的频繁项集

算法理论准备:

         无序性:集合中的元素的排列顺序无先后之分;元素相同而排列顺序不同的集合是相等的集合
         频繁项集的等价转化(方便用数学的方法不重复的确定唯一的一个集合):虽然集合是无序的,但一个频繁项集一一对应一个有序(即按频繁项出现次数多少的顺序)的频繁项串,因此我们认为一个有序的频繁项串等价于一个频繁项集。求出所有的有序频繁项串,也就求出了所有频繁项集。

         项集=有序项串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(Treea)   // FP_growth 为从Tree(a)中,寻找后缀为a的频繁项集的集合(a为频繁项集),,

                  if Tree 含单个路径then{

                            for 路径P中结点的每个组合(记作b

                            产生模式b U a,其支持度support = 中结点的最小支持度;//

                  }

                 else {

                  for each i 在Tree的头部{ //第一次时对每一项集的条件FP树后进行模式增长生成,

                  产生一个模式b = i U a,其支持度support .support;aj<=a的support的,:-)

                  构造b的条件模式基,然后构造b的条件FP-树Treeb;

                  if Treeb 不为空 then    

                            调用 FP_growth (Treeb, b);

           }

}

FP算法的优缺点

 

        



阅读更多
个人分类: Data Mining
博主设置当前文章不允许评论。

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭