关联分析的FP-growth算法 in Python

基于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的商品。

设定minSupport为3,扫描得商品频数:d-7,b-7,c-7,a-6,f-4,其他商品频数均小于minSupport被删除。

{d,b,c,a,f}即为频繁1项集,记作F1。

第二步:进行第二次也是最后一次扫描数据集,对于每一条交易记录,按照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}入,得到

关联分析的FP-growth算法 in Python_第1张图片

再插入第二条记录{d b f},得到

关联分析的FP-growth算法 in Python_第2张图片

再插入第三条记录{d b c},得到

关联分析的FP-growth算法 in Python_第3张图片

找到规律后,将剩余记录依次插入,可得树

关联分析的FP-growth算法 in Python_第4张图片

最后再增加一个header table,把FP-tree中相同item连接起来,按降序排序,得到完整的FP-growth树:

关联分析的FP-growth算法 in Python_第5张图片



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的组合都是频繁项集)。

关联分析的FP-growth算法 in Python_第6张图片


3、进一步说明

3.1 FP-Tree中header table按item降序排序原因:不排序会造成不能共用前缀,或者更多的共用前缀,因为频繁的item会在树的上层,可以被更多的共享;升序排序会造成那些频繁出现的item出现在树的分支中,不能更多的共用前缀。


你可能感兴趣的:(机器学习)