FP-tree(growth)
针对Apriori算法的不足,韩家炜提出了FP-tree算法。思想如下:
通过扫描购物篮数据,产生一个叫FP-tree的数据结构,通过该树就可以将频繁项集分析出来,而完全避免产生候选集(这在apriori算法中是最耗资源的)
FP-tree树的产生过程:
1.扫描整个事务数据库,产生如下L-list项目计数表并按从高到低排序:
2.将原购物篮中的每个项集,都重新按照以上次序排好顺序,例如T100排序后为:I2 I1 I5
3.开始画树,T100排序后为:I2 I1 I5,则先画一个跟节点,从根节点往下画分支,分别是I2节点- I1节点- I5节点,并分别计数为1;
接下来是T200:I2,I4.从根节点开始看,有以I2为起点的一条路径,则I2计数加1,原路径I2下面没有I4,则I4沿I2走另外一条路径,并计数为1.。。。如此往复,就生成了如下FP-tree:
4.为了以后计算,在L-List中增加一个结点链,存储某个节点的位置。例如:第一个生成I2,则将I2节点的位置存储在I2 的节点项中,第一个I1同理,当产生第二个I1的时候,再第一个I1节点中开辟一个结点项,存储第二个I1的位置,后者依次。。
这样就将需要处理的购物篮信息转变成了一棵有序的树形结构,之所以Apriori算法需要反复扫描数据库就是因为数据库杂乱无章,不能提供什么有效的信息,只能逐一扫描,检查次数,而FP-tree则在高度组织化的条件下,高效的挖掘频繁子集,而避免过多的扫描事务数据库,其实,FP-tree总共只扫描了两次数据库,第一次是为了建立L-list,第二次则是为了建树。
其实,FP-tree为了建树同样是非常耗费内存的,这就催生了PFP(Parallel FPGrowth),将一整棵大树分而治之的处理。这个算法,待到日后再研究,接下来分析一下FP-tree的挖掘过程。
挖掘:
从L-list最低层往上遍历所有item,建立如下表格:
条件模式基指的是可以到达某个节点的除该节点以外的所有路径及其相应的路径条数,路径计数以该节点的次数为准。例如到达I5的路径有两条:I2-I1-I5和I2-I1-I3-I5,除I5之外就是:I2-I1和I2-I1-I3,两条路径上I5都是出现了1次,所以计数均为1,这样I5的条件模式基就是I2-I1:1和I2-I1-I3:1
条件FP树指的是:用类似于画FP树的方法去建子FP-tree,同时去掉小于最小支持度的节点,例如I5建树时,各个节点计数情况是:I2:2,I2:2,I3:1,由于I3计数小于2,在该子树上将I3去掉
产生的频繁模式:就是节点的各种组合了,规律:挖掘的某个项的频繁模式一定是以该项结尾的模式,例如I1挖掘出来的模式就是I2,I1 :4
韩家炜给出的算法伪代码如下: