关联分析是从大量数据中发现项集之间相关联系,分析出如“因为某些事件的发生而致使另一些事件的发生”之类的规则。web
关联分析的一个典型例子是购物车分析。该过程经过发现用户加入购物车中的不一样商品之间的联系,分析用户的购买习惯,了解哪些商品频繁地被用户同时购买。这种关联关系的发现能够帮助商家制定营销策略,例如商品的促销和摆放组合等。算法
FP-Growth算法是韩嘉炜等人提出的关联分析算法。该个算法构建经过两次数据扫描,将原始数据中的item压缩到一个FP-tree(Frequent Pattern Tree,频繁模式树)上,接着经过FP-tree找出每一个item的条件模式基,最终获得全部的频繁项集。cdn
定义“TID”为订单ID,“Items bought”为一次订单内购买的商品,准备原始数据以下表所示。blog
TID | Items bought |
---|---|
100 | {f, a, c, d, g, i, m, p} |
200 | {a, b, c, f, l, m, o} |
300 | {b, f, h, j, o} |
400 | {b, c, k, s, p} |
500 | {a, f, c, e, l, p, m, n} |
在构建FP-Tree以前,首先要创建一张项头表。扫描原始数据,并对每一个商品进行计数。在这里能够设置阈值,好比保留最少要出现三次的商品。筛选后剩下a,b,c,f,m,p这六个商品,将这些商品按数量降序排列,生成项头表。排序
Item | Count |
---|---|
f | 4 |
c | 4 |
a | 3 |
b | 3 |
m | 3 |
p | 3 |
接下来开始第二次扫描原属数据,对于每条数据,剔除非项头表上的商品,并按照支持度降序排列。好比订单100,购买商品为{f, a, c, d, g, i, m, p},剔除数据后为{f, a, c, m, p},排序后为{f, c, a, m, p}。其余的原始数据以此类推动行处理,获得排序后的数据集。递归
TID | Items bought | (Ordered) frequent items |
---|---|---|
100 | {f, a, c, d, g, i, m, p} | {f, c, a, m, p} |
200 | {a, b, c, f, l, m, o} | {f, c, a, b, m} |
300 | {b, f, h, j, o} | {f, b} |
400 | {b, c, k, s, p} | {c, b, p} |
500 | {a, f, c, e, l, p, m, n} | {f, c, a, m, p} |
有了项头表和筛选排序后的原始数据集,接下来就能够构建FP-Tree了。创建FP-Tree须要咱们一条条的读取筛选排序后的原始数据,并按照顺序依次插入到树中。若是有公共的祖先节点,则在对应的祖先节点加1。同时,新节点出现时,须要将其连接到项表头对应的节点链表。直到全部数据都插入树中,则构建完成。事件
接下来仍是用上面的数据举个例子。首先插入TID 100,此时FP-Tree没有其余节点,所以{f, c, a, m, p}是一个独立的路径,全部节点计数为1, 项头表经过节点链表连接上对应的新增节点。部署
接着插入TID 200,{f, c, a, b, m},其中f、c、a三个节点公用,计数变为2,到b节点产生新的分支,m为b的子节点,两个节点计数为1。固然,对应的b、m两个节点的链表也要更新。get
依次处理剩下的三条数据,构建完成FP-Treeit
准备好了FP-Tree,接下来就能够开始挖掘频繁项集。遍历项头表依次挖掘,找到每项的条件模式基。条件模式基是以要挖掘的节点做为叶子节点所对应的子树。获得这个子树,将子树中每一个节点的的计数设置为叶子节点的计数,并删除计数低于约定值的节点。从这个条件模式基,咱们就能够递归挖掘获得频繁项集了。
假设须要的最小节点计数为2,开始挖掘p节点,以下图所示
删除图中节点计数小于2的红色{c:1}、{b:1}、{p:1}节点,获得{p:2}节点的条件模式基为{f:2, c:2, a:2, m:2}。经过它,能够递归获得频繁二项集{f:2, p:2}、{c:2, p:2}、{a:2, p:2}、{m:2, p:2},频繁三项集{f:2, c:2, p:2}、{f:2, a:2, p:2}等等,最后获得最大的频繁项集为频繁五项集,为{f:2, c:2, a:2, m:2, p:2}。
若是最小节点计数为1,则可在挖掘完上面的子树后,根据项表头对应的节点链表找到红色的节点{p:1},继续挖掘频繁项集。
至此,p节点挖掘完毕,能够继续挖掘其余节点。挖掘完全部节点,也就获得了全部的频繁项集。至于最后f节点,因为它的条件模式基为空,所以能够不用去挖掘。
经过上面的介绍,能够注意到在挖掘频繁项集时,FP-Tree可能会很是大,递归获得的频繁项集也可能有指数多个。但同时也发现,每一个项头表的商品对应的挖掘子树,都是互相独立的,也就是说能够并行化挖掘频繁集。所以,能够单个商品构建一棵FP-Tree,也能够几个商品以小组的形式构建一棵FP-Tree。
回忆一下单机挖掘频繁项集的步骤,能够总结出可并行化执行的节点以下:
所以,能够总结出并行挖掘频繁集的步骤以下所示:
抄个算法放在这里:
再抄个算法放在这里:
最后抄一个算法放在这里:
再讲几个能够对算法结果进行干预的点吧。除了上面介绍算法时两个能够对数据进行筛选的节点,还能够在算法前对原始数据进行处理,或者算法结束后对生成的频繁项集进行处理。
一、首先能够根据订单里商品出现的次数、订单时间、日均销量等信息设定权重值。并根据加权后的数据进行项头表和FP-Tree的构建。
二、其次对于生成的频繁结果集,能够经过计算置信度和提高度对最终结果进行筛选。
最后,贴两篇参考文章。