关联分析算法:FP-Growth

栏目: 数据库 · 发布时间: 5年前

内容简介:关联分析是从大量数据中发现项集之间相关联系,分析出如“由于某些事件的发生而导致另外一些事件的发生”之类的规则。关联分析的一个典型例子是购物车分析。该过程通过发现用户加入购物车中的不同商品之间的联系,分析用户的购买习惯,通过了解哪些商品频繁地被用户同时购买。这种关联关系的发现可以帮助商家制定营销策略,例如商品的促销和摆放组合等。FP-Growth算法是韩嘉炜等人提出的关联分析算法。该个算法构建通过两次数据扫描,将原始数据中的item压缩到一个FP-tree(Frequent Pattern Tree,频繁模

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

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

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

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

1、FP-Growth

1.1 原始数据准备

定义“TID”为订单ID,“Items bought”为一次订单内购买的商品,准备原始数据如下表所示。

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, 项头表通过节点链表链接上对应的新增节点。

关联分析算法:FP-Growth

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

关联分析算法:FP-Growth

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

关联分析算法:FP-Growth

1.5 挖掘频繁项集

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

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

关联分析算法:FP-Growth

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

2、PFP-Growth

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

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

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

因此,可以总结出并行挖掘频繁集的步骤如下所示:

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

抄个算法放在这里:

关联分析算法:FP-Growth
  • 第二步,将项头表的商品分组,对每一组进行单独的频繁项集挖掘。

再抄个算法放在这里:

关联分析算法:FP-Growth
  • 第三步,将第二步的结果进行聚合总结。

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

关联分析算法:FP-Growth

3、其他

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

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

2、其次对于生成的频繁结果集,可以通过计算置信度和提升度对最终结果进行筛选。

  • 其中置信度计算规则,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时,表示两件事相互独立,即一件事的发生,对于另一件事的出现无影响。

最后,贴两篇参考文章。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Algorithms

Distributed Algorithms

Wan Fokkink / The MIT Press / 2013-12-6 / USD 40.00

This book offers students and researchers a guide to distributed algorithms that emphasizes examples and exercises rather than the intricacies of mathematical models. It avoids mathematical argumentat......一起来看看 《Distributed Algorithms》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具