关联分析
关联分析是指一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集或者关联规则。
频繁项集是经常出现在一块的物品的集合,关联规则暗示两种物品之间可能存在较强的关系。下面举一个实例:
交易号码 | 商品 |
---|---|
0 | 豆奶,莴苣 |
1 | 莴苣,尿布,葡萄酒,甜菜 |
2 | 豆奶,尿布,葡萄酒,橙汁 |
3 | 莴苣,豆奶,尿布,葡萄酒 |
4 | 莴苣,豆奶,尿布,橙汁 |
频繁项集是指那些经常出现在一起的物品的集合,比如上面的例子中,{豆奶,尿布,葡萄酒}就是频繁项集,它几乎出现在每一条交易信息中。上面的例子中还可以找到例如(尿布–>葡萄酒)的管理规则。这意味着买尿布的人很可能会买葡萄酒。
下面引入一些用来定量描述“有趣”、“频繁”等名词:
- 支持度:一个项集的支持度被定义为在数据集中包含该项集的记录所占的比例。比如上面的例子中,{豆奶}的支持度是4/5,5条信息中有4条都出现了豆奶。{尿布,葡萄酒}的支持度是3/5,这个组合一共出现了3次。支持度是针对项集来说的,因此可以定义一个最小支持度,用来只保留满足最小支持度的项集。
- 可信度或置信度:这是针对一条诸如(尿布–>葡萄酒)的管理规则来定义的。这条规则的可信度定义为“支持度({尿布,葡萄酒})/支持度({尿布})”,类似于概率中的条件概率。经计算得出该规则的可信度为0.75,这意味着对应包含尿布的记录中,75%包含了葡萄酒。
支持度和可信度是用来量化关联分析是否成功的方法。假设我们要找支持度大于0.8的所有项集,如何去做呢?最简单也是最暴力的办法就是使用排列组合,遍历出所有的组合并对每一组计算支持度。对于N个物品来说,一共有 ( 2 N − 1 ) (2^N-1) (2N−1)种组合,复杂度过大。下面介绍一种新的算法来降低计算量。
Apriori原理
我们首先把上面的例子中的物品用索引进行表示,规则如下:
{
'豆奶':0,
'莴苣':1,
'尿布':2,
'葡萄酒':3,
'甜菜':4,
'橙汁':5
}
这样我们就得到了一组数据集:
[
[0,1],
[1,2,3,4],
[0,2,3,5],
[1,0,2,3],
[1,0,2,5]
]
方便了计算机的处理。
Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。显然这个结论可以很容易的证明,但对我们来说似乎没有帮助。所以我们利用它的逆否命题,即如果一个项集是非频繁项集,那么它的所有超集也是非频繁的。
我们假设{2,3}这个项集是非频繁的,利用上面的定理,项集{1,2,3}、{0,2,3}、{1,2,3,4}等也是非频繁的。也就是说,如果我们计算出{2,3}的支持度,发现它是非频繁项集,那么我们就不用再计算包含{2,3}的项集了,因为它们肯定也是非频繁的,这样就可以减少计算量,方便我们的运算。
使用Apriori计算频繁集
该算法的两个输入参数分别是最小支持度和数据集。算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,对于不满足的则直接剔除。然后再对剩下的集合中进行组合生成包含两个元素的项集。继续扫描,去除不符合最低支持度的项集。以此类推,直到所有的项集都被去掉。
首先我们要将数据引入到python中,为了方便,直接将上面的数组存入即可。
def create_data():
x = [
[0, 1],
[1, 2, 3, 4],
[0, 2, 3, 5