FP-growth算法,fpgrowth算法详解

FP-growth算法,fpgrowth算法详解


使用FP-growth算法来高效发现频繁项集

前言

你用过搜索引擎挥发现这样一个功能:输入一个单词或者单词的一部分,搜索引擎酒会自动补全查询词项,用户甚至实现都不知道搜索引擎推荐的东西是否存在,反而会去查找推荐词项,比如在百度输入“为什么”开始查询时,会出现诸如“为什么我有了变身器却不能变身奥特曼”之类滑稽的推荐结果,为了给出这些推荐查询慈祥,搜索引擎公司的研究人员使用了本文要介绍的一个算法,他们通过查看互联网上的用词来找出经常在一块出现的词对,这需要一种高效发现频繁集的方法。该算法称作FP-growth,又称为FP-增长算法,它比Apriori算法要快,它基于Apriori构建,但在完成相同任务时采用了一些不同的技术。不同于Apriori算法的”产生-测试”,这里的任务是将数据集存储在一个特定的称做FP树的结构之后发现频繁项集或者频繁项对,即常在一块出现的元素项的集合FP树,这种做法是的算法的执行速度要快于apriori,通常性能要好两个数量级以上。

FP树表示法

FP树时一种输入数据的压缩表示,它通过逐个读入事务,并把事务映射到FP树中的一条路径来构造,由于不同的事务可能会有若干个相同的项,因此它们的路径可能部分重叠。路径相互重叠越多,使用FP树结构获得的压缩效果越好,如果FP树足够小,能够存放在内存中,就可以直接从这个内存中的结构提取频繁项集,而不必重复地扫描存放在硬盘上的数据。

下图显示了一个数据集,它包含10个事务和5个项。(可以把一条事务都直观理解为超市的顾客购物记录,我们利用算法来发掘那些物品或物品组合频繁的被顾客所购买。)

FP-growth算法,fpgrowth算法详解_第1张图片

下图绘制了读入三个事务之后的FP树的结构以及最终完成构建的FP树,初始,FP树仅包含一个根节点,用符号null标记,随后,用如下方法扩充FP树:

FP-growth算法,fpgrowth算法详解_第2张图片
FP-growth算法,fpgrowth算法详解_第3张图片
FP-growth算法,fpgrowth算法详解_第4张图片
FP-growth算法,fpgrowth算法详解_第5张图片

通常,FP树的大小比未压缩的数据小,因为购物篮数据的事务常常共享一些共同项,在最好的情况下,所有的事务都具有相同的项集,FP树只包含一条节点路径,当每个事务都具有唯一项集时,导致最坏情况发生,由于事务不包含任何共同项,FP树的大小实际上与原数据的大小一样,然而,由于需要附加的空间为每个项存放节点间的指针和技术,FP树的存储需求增大。

FP树还包含一个连接具有相同项的节点的指针列表,这些指针再上图中用虚线表示,有助于快速访问树中的项。

FP增长算法的频繁项集产生

FP-growth是一种以自底向上方式探索树,由FP树产生频繁项集的算法,给定上面构建的FP树,算法首先查找以e结尾的频繁项集,接下来是b,c,d,最后是a,由于每一个事务都映射到FP树中的一条路径,因为通过仅考察包含特定节点(例如e)的路径,就可以发现以e结尾的频繁项集,使用与节点e相关联的指针,可以快速访问这些路径,下图显示了所提取的路径,后面详细解释如何处理这些路径,以得到频繁项集。

FP-growth算法,fpgrowth算法详解_第6张图片
FP-growth算法,fpgrowth算法详解_第7张图片
FP-growth算法,fpgrowth算法详解_第8张图片
FP-growth算法,fpgrowth算法详解_第9张图片
FP-growth算法,fpgrowth算法详解_第10张图片

上面的图演示了讲频繁项集产生的问题分解成多个子问题,其中每个子问题分别涉及发现以e,d,c,b和a结尾的频繁项集

发现以e结尾的频繁项集之后,算法通过处理与节点d相关联的路径,进一步寻找以d为结尾的频繁项集,继续该过程,直到处理了所有与节点c,b和a相关联的路径为止,上面的图分别显示了这些项的路径,而他们对应的频繁项集汇总在下表中

FP-growth算法,fpgrowth算法详解_第11张图片

FP增长采用分治策略将一个问题分解为较小的子问题,从而发现以某个特定后缀结尾的所有频繁项集。例如,假设对发现所有以e结尾的频繁项集感兴趣,为了实现这个目的,必须首先检查项集{e}本身是否频繁,如果它是平凡的,则考虑发现以de结尾的频繁项集子问题,接下来是ce和ae,依次,每一个子问题可以进一步划分为更小的子问题,通过合并这些子问题的结果,就可以找到所有以e结尾的频繁项集,这种分治策略是FP增长算法采用的关键策略。

为了更具体地说明如何解决这些子问题,考虑发现所有以e结尾的频繁项集的任务。

FP-growth算法,fpgrowth算法详解_第12张图片
FP-growth算法,fpgrowth算法详解_第13张图片
FP-growth算法,fpgrowth算法详解_第14张图片
FP-growth算法,fpgrowth算法详解_第15张图片
FP-growth算法,fpgrowth算法详解_第16张图片
FP-growth算法,fpgrowth算法详解_第17张图片

这个例子解释了FP增长算法中使用的分治方法,每一次递归,都要通过更新前缀路径中的支持度计数和删除非频繁的项来构建条件FP树,由于子问题时不相交的,因此FP增长不会产生任何重复的项集,此外,与节点相关联的支持度计数允许算法在产生相同的后缀项时进行支持度计数。

FP增长是一个有趣的算法,它展示了如何使用事务数据集的压缩表示来有效的产生频繁项集,此外对于某些事务数据集,FP增长算法比标准的Apriori算法要快几个数量级,FP增长算法的运行性能取决于数据集的“压缩因子”。如果生成的FP树非常茂盛(在最坏的情况下,是一颗完全二叉树)则算法的性能显著下降,因为算法必须产生大量的子问题,并且需要合并每个子问题返回的结果

你可能感兴趣的:(算法)