代码改变世界

关联规则

2013-03-07 14:51  ggzwtj  阅读(790)  评论(0编辑  收藏  举报

啤酒和尿布

  在超市中人们发现一个有趣的现象:啤酒和尿布这两种风牛马不相及的东西摆放在了一起。这种奇怪的做法使得啤酒和尿布的销量大量增加。对此的解释可能是:一般都是妇女在家照顾孩子,丈夫在下班回家的时候会去买尿布,这时候会去顺便买一瓶自己喜欢的啤酒。

  当然,啤酒和尿布的关系可以通过细心的观察得到,而并不是所有的这种规则都能通过观察现象得到。所以,需要有一种算法来寻找这种规则,并且衡量找到规则的有效性——这就是数据挖掘中的关联规则。

概念

稍微想一下,关联规则要解决的是两个问题:

  • 如何找到规则?
  • 找到的规则是否有效?

比如,超市的数据库中发现所有的购买了下面这几种物品:

  A B C D E F G

那么,找到的规则总共有2^N(这个时候N = 6)个:

  • A
  • A B
  • A B C
  • ……

其实这里注意到,一个规则中的各项之间的关系是与(也就是说需要同时满足),那么如何验证一个规则的有效性?可行的一种做法是:

  • 有足够多的数据在买东西的时候符合这条规则;

这条当然是可行的,但是注意到:

  {A B}、{A C}{B C}是{A B C}的子集

这就意味着,{A B C}满足这条规则的时候,那么{A B}、{A C}、{B C}必然也满足这条规则。而这里我们要挖掘的完整的规则应该是{A B C},也就是:

  • 在一条规则中加入新项之后,还是有大致相同的数据满足,那么这条规则应该被加入进来;

现在介绍置信度和支持度这两个概念:

  • 支持度:A和B同时出现的概率,也就是P(A∩B);
  • 置信度:在A发生的情况下,B也发生的概率,也就是P(B|A);

那么,在判断一条规则是否满足要求时,需要检查支持度;在是否在一条规则中加入新的项时,需要判断置信度。现在再来看关联规则的与关系:

  • 如果一条规则满足支持度,那么它的任何一个子集都满足;
  • 如果一条规则不满足支持度,那么任何一个包含该规则的规则都不可能满足支持度(感觉置信度可以过滤掉很多无用的规则,提高质量);

很多的算法都是用这两条规则来挖掘关联规则。

Apirori算法

Apirori是非常暴力的解决方案,步骤如下:

  1. 找到所有大于支持度下限的项L1(也就是找到了大小为一的所有规则);
  2. 从Li扩展到Li+1
  3. 将Li+1中不满足支持度的规则去掉;
  4. 如果Li+1不为空,转2。
  5. 返回搜索到的规则。

需要注意的是扩展过程:

  • {C D}只会扩展到{C D E}、{C D F}、{C D G},而不会扩展到{C D B},这样可以保证不重复地遍历到所有的情况;
  • 验证支持度的消耗可能非常大a;