关联分析算法:FP-Growth

关联分析是从大量数据中发现项集之间相关联系,分析出如“因为某些事件的发生而致使另一些事件的发生”之类的规则。web

关联分析的一个典型例子是购物车分析。该过程经过发现用户加入购物车中的不一样商品之间的联系,分析用户的购买习惯,了解哪些商品频繁地被用户同时购买。这种关联关系的发现能够帮助商家制定营销策略,例如商品的促销和摆放组合等。算法

FP-Growth算法是韩嘉炜等人提出的关联分析算法。该个算法构建经过两次数据扫描,将原始数据中的item压缩到一个FP-tree(Frequent Pattern Tree,频繁模式树)上,接着经过FP-tree找出每一个item的条件模式基,最终获得全部的频繁项集。cdn

  • 优势:简单易上手,部署起来也很方便。
  • 缺点:须要有较多的数据,且效果通常。

一、FP-Growth

1.1 原始数据准备

定义“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}

1.2 创建项头表

在构建FP-Tree以前,首先要创建一张项头表。扫描原始数据,并对每一个商品进行计数。在这里能够设置阈值,好比保留最少要出现三次的商品。筛选后剩下a,b,c,f,m,p这六个商品,将这些商品按数量降序排列,生成项头表。排序

Item Count
f 4
c 4
a 3
b 3
m 3
p 3

1.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}

1.4 构建FP-Tree

有了项头表和筛选排序后的原始数据集,接下来就能够构建FP-Tree了。创建FP-Tree须要咱们一条条的读取筛选排序后的原始数据,并按照顺序依次插入到树中。若是有公共的祖先节点,则在对应的祖先节点加1。同时,新节点出现时,须要将其连接到项表头对应的节点链表。直到全部数据都插入树中,则构建完成。事件

接下来仍是用上面的数据举个例子。首先插入TID 100,此时FP-Tree没有其余节点,所以{f, c, a, m, p}是一个独立的路径,全部节点计数为1, 项头表经过节点链表连接上对应的新增节点。部署

avatar

接着插入TID 200,{f, c, a, b, m},其中f、c、a三个节点公用,计数变为2,到b节点产生新的分支,m为b的子节点,两个节点计数为1。固然,对应的b、m两个节点的链表也要更新。get

avatar

依次处理剩下的三条数据,构建完成FP-Treeit

avatar

1.5 挖掘频繁项集

准备好了FP-Tree,接下来就能够开始挖掘频繁项集。遍历项头表依次挖掘,找到每项的条件模式基。条件模式基是以要挖掘的节点做为叶子节点所对应的子树。获得这个子树,将子树中每一个节点的的计数设置为叶子节点的计数,并删除计数低于约定值的节点。从这个条件模式基,咱们就能够递归挖掘获得频繁项集了。

假设须要的最小节点计数为2,开始挖掘p节点,以下图所示

avatar

删除图中节点计数小于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节点,因为它的条件模式基为空,所以能够不用去挖掘。

二、PFP-Growth

经过上面的介绍,能够注意到在挖掘频繁项集时,FP-Tree可能会很是大,递归获得的频繁项集也可能有指数多个。但同时也发现,每一个项头表的商品对应的挖掘子树,都是互相独立的,也就是说能够并行化挖掘频繁集。所以,能够单个商品构建一棵FP-Tree,也能够几个商品以小组的形式构建一棵FP-Tree。

回忆一下单机挖掘频繁项集的步骤,能够总结出可并行化执行的节点以下:

  • 创建项头表
  • 构建FP-Tree
  • 挖掘频繁项集

所以,能够总结出并行挖掘频繁集的步骤以下所示:

  • 第一步,分割原始数据,根据分割的每片数据,并行化计数,生成项头表。

抄个算法放在这里:

avatar

  • 第二步,将项头表的商品分组,对每一组进行单独的频繁项集挖掘。

再抄个算法放在这里:

avatar

  • 第三步,将第二步的结果进行聚合总结。

最后抄一个算法放在这里:

avatar

三、其余

再讲几个能够对算法结果进行干预的点吧。除了上面介绍算法时两个能够对数据进行筛选的节点,还能够在算法前对原始数据进行处理,或者算法结束后对生成的频繁项集进行处理。

一、首先能够根据订单里商品出现的次数、订单时间、日均销量等信息设定权重值。并根据加权后的数据进行项头表和FP-Tree的构建。

二、其次对于生成的频繁结果集,能够经过计算置信度和提高度对最终结果进行筛选。

  • 其中置信度计算规则,conf(X->Y) = P(Y|X) = P(X,Y)/P(X)。置信度越高,关联性越强。
  • 提高度计算规则,lift(X->Y)=P(X,Y)/(P(X)P(Y)) = conf(X->Y)/P(Y)。关联规则提高度大于1,为有效;小于等于1,为无效。特别的,当提高度等于1时,表示两件事相互独立,即一件事的发生,对于另外一件事的出现无影响。

最后,贴两篇参考文章。

相关文章
相关标签/搜索