基于Apriori算法构建的FP-growth算法,利用了巧妙的数据结构,只需要对数据集进行两次扫描,可以更高效的发现频繁项集,通常性能要比前者好两个数量级以上,但注意其不能用于发现关联规则。
1、构建FP-growth树
下面我们随机设定一个数据集,然后逐步构建FP-growth树。
创建一个常用的购物数据集,每行为一条交易记录,每个字母代表一种商品,共有商品7中,分别为a-g。
交易号码 商品 #0001 a b c d #0002 b e d f #0003 b c d #0004 a b c e d f #0005 a c f #0006 b c f #0007 a c d #0008 a b c g d #0009 a b g d
第一步:首次扫描数据集,对每项交易记录中的商品按频数进行递减排序,并删除频数小于最小支持度minSupport的商品。
第二步:进行第二次也是最后一次扫描数据集,对于每一条交易记录,按照F1中的顺序重新排序。设定minSupport为3,扫描得商品频数:d-7,b-7,c-7,a-6,f-4,其他商品频数均小于minSupport被删除。
{d,b,c,a,f}即为频繁1项集,记作F1。
交易号码 商品 #0001 d b c a #0002 d b f #0003 d b c #0004 b d c a f #0005 c a f #0006 b c f #0007 d c a #0008 d b c a #0009 d b a
第三步,将F1中各条记录插入到FP-growth树中。
规则很简单,相同前缀的路径可以共用,并且初始节点的后缀模式为空。
首先,将F1中的第一条记录插{d b c a}入,得到
再插入第二条记录{d b f},得到
再插入第三条记录{d b c},得到
找到规律后,将剩余记录依次插入,可得树
最后再增加一个header table,把FP-tree中相同item连接起来,按降序排序,得到完整的FP-growth树:
2、从FP-growth树发掘频繁项集
这里将利用生成的FP-growth树来实现频繁项集发掘过程,不再需要原始数据集了,总共分为三个基本步骤,我们逐步进行。
第一步,从header table的最下面的item开始,构造每个item的条件模式基。
顺着header table中item的链表,找出所有包含该item的前缀路径,这些前缀路径就是该item的条件模式基CFB。
所有这些CPB的频繁度(计数)为该路径上item的频繁度。
因此,上述FP-growth得到
item CFB f dbca:1, db:1, ca:1, bc:1 a db:1, dbc:3, dc:1, c:1 c db:4, d:1, {}:1, b:1 b d:6, {}:1 d {}:7
第二步,构造条件FP-tree
累加每个CPB上的item的频繁度(计数),过滤低于阈值的item,构建FP-tree
第三步,执行FG-growth算法
递归的挖掘每个条件FP-tree,累加后缀频繁项集,直到找到FP-tree为空或者FP-tree只有一条路径(只有一条路径情况下,所有路径上item的组合都是频繁项集)。
3、进一步说明
3.1 FP-Tree中header table按item降序排序原因:不排序会造成不能共用前缀,或者更多的共用前缀,因为频繁的item会在树的上层,可以被更多的共享;升序排序会造成那些频繁出现的item出现在树的分支中,不能更多的共用前缀。