以前介绍的apriori算法中由于存在许多的缺陷,例如进行大量的全表扫描和计算量巨大的天然链接,因此如今几乎已经再也不使用算法
在mahout的算法库中使用的是PFP算法,该算法是FPGrowth算法的分布式运行方式,其内部的算法结构和FPGrowth算法相差并非十分巨大分布式
因此这里首先介绍在单机内存中运行的FPGrowth算法指针
仍是使用apriori算法的购物车数据做为例子,以下图所示:排序
TID为购物车项的编号,i1-i5为商品的编号内存
FPGrowth算法的基本思想是,首先扫描整个购物车数据表,计算每一个商品的支持度,并从大到小从上往下排序,获得以下表所示
数据挖掘
从底部最小支持度开始,逐一构建FP树io
构建过程以下图:class
最终构建出的FP树以下图im
将这个FP树和支持度表关联起来以下图:技术
支持度表中的每一项都有一个存放指向FP树中对应节点的指针,例如第一行指向i2:7;第二行指向i1:4,由于i1节点还出如今FP树中的其余位置,所谓i1:4节点中还存放着指向i1:2节点的指针
经过少数的全表扫描构建好的FP树将购物车没有规律的数据变成了一个有迹可循的树形结构,而且省去了进行巨大的天然链接的运算
经过FP树挖掘出关联规则:
经过上图的FP树,咱们能够根据每一个商品获得该商品对应的条件模式基,条件FP树和产生的频繁模式
例如i5
在FP树中能够看到,从根节点到i5:1的路径有两条:
i2:7-->i1:4-->i5:1
i2:7-->i14-->i3:2-->i5:1
i2:7-->i1:4和i2:7-->i14-->i3:2就是i5的条件模式基,由于最终到达的节点确定是i5,因此将i5省略
记为{i2,i1:1}{i2,i1,i3:1},为何每一个条件模式基的计数为1呢?虽然i2和i1的计数都很大,可是因为i5的计数为1,最终到达i5的重复次数也只能为1。因此条件模式基的计数是根据路径中节点的最小计数来决定的
根据条件模式基,咱们能够获得该商品的条件FP树,例如i5:
根据条件FP树,咱们能够进行全排列组合,获得挖掘出来的频繁模式(这里要将商品自己,如i5也算进去,每一个商品挖掘出来的频繁模式必然包括这商品自己)
根据FP树获得的全表以下:
至此,FPGrowth算法输出的结果就是产生的频繁模式,FPGrowth算法使用的是分而治之的方式,将一颗可能十分巨大的树形结构经过构构建条件FP子树的方式分别处理
可是在商品数据十分巨大的状况下,FPGrowth算法所构建的FP树可能会大到计算机内存都没法加载,这时就要使用分布式的FPGrowth,PFP算法来进行计算
本文参考书:《数据挖掘概念与技术》