关联规则
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是非常暴力的解决方案,步骤如下:
- 找到所有大于支持度下限的项L1(也就是找到了大小为一的所有规则);
- 从Li扩展到Li+1;
- 将Li+1中不满足支持度的规则去掉;
- 如果Li+1不为空,转2。
- 返回搜索到的规则。
需要注意的是扩展过程:
- {C D}只会扩展到{C D E}、{C D F}、{C D G},而不会扩展到{C D B},这样可以保证不重复地遍历到所有的情况;
- 验证支持度的消耗可能非常大a;