数据相似性

首先模拟一些数据出来:假设有这样一些ID是1~5的条目,然后有几个人对他们看过的条目进行了评分(1~5),那么我们可能有这样的一组数据,格式是:
人名:{条目ID:条目得分}
==================
A:{1:3, 2:4, 4:3, 5:3}
B:{1:2, 2:4, 3:4, 4:3}
C:{2:4, 4:2, 5:4}
...

给定两个人,如何计算他们的相似度,比如,在B和C里,谁和A的评分最相似?给出一些方法:

1:简单匹配系数(Simple Matching Coefficient, SMC)
SMC = 值匹配的属性个数 / 属性个数 = (f11 + f00) / (f01 + f10 + f11 + f00),其中
f00 = x取0并且y取0的属性个数
f11 = x取1并且y取1的属性个数
...
0,1表示该条目是否出现,对此例来说,就是要忽略评分情况,只根据看过与否,得到下面的数据:
A = (1, 1, 0, 1, 1) (因为看过ID是1,2,4,5)的条目
B = (1, 1, 1, 1, 0) (因为看过ID是1,2,3,4)的条目
C = (0, 1, 0, 1, 1) (因为看过ID是2,4,5)的条目
计算A和B的SMC系数:
f11 = 3 (两者同时为1的条目的个数)
f00 = 0 ; f10 = 1 ; f01 = 1
SMC(A, B) = (f11 + f00) / (f01 + f10 + f11 + f00) = (3+0) / (3 + 0 + 1 + 1) = 3 / 5 = 0.6
同理:SMC(A,C) = (3 + 1) / (3 + 1 + 0 + 1) = 4 / 5 = 0.8

从公式上看,因为分子是f11和f00之和,也就是说,该方法同等地对出现和不出现进行计数,就是说它把出现和不出现看得同等的重要;所以这种方法适合处理条目具有对称的二元属性,例如:在一个仅包含是非题的测验中发现回答问题相似的学生。

这里我们还没有考虑每个人的评分。。。因为。。这个方法叫[简单]匹配系数。。#_#

2:Jaccard系数
j = f11 / (f01 + f10 + f11)
可以看出来,该公式和上面的式子差不多,只是少了f00,也就是说,在使用它的计算分子的过程中,并不关心那些两者都没有出现过的数据,只对同时出现的数据感兴趣。
仍然以上面为例:
jaccard(A, B)= 3 / (3 + 1 + 1) = 0.6
jaccard(A, C)= 3 / (3 + 0 + 1) = 0.75
由于使用这个计算分子时并不关心大家都没有读的条目。所以这个方法适用于含有大量的0属性,而需要比较关注的是1的属性(即非对称二元属性)的数据。
例如:对一个商店的商品,1表示被购买,0表示没有被购买,这样未被顾客购买的商品数远大于被其购买的商品数,而可能需要关心的是那些同时被购买的商品。

3:欧几里得距离
因为打不出求和和开方的符号,用代码代替:
d = sqrt(pow(x1-y1, 2) + pow(x2-y2, 2) + ... pow(xn-yn, 2)) 也就是求两点间的距离公式。
这种方法是比较通用的,不论是否是二元属性,不论是否是只考虑交集部分,它都能计算出结果:
对上例来说,不论我们只取二元属性:
A = (1, 1, 0, 1, 1)
B = (1, 1, 1, 1, 0)
还是考虑进每个人的评分:
 A= (3, 4, 0, 3, 3)
 B= (2, 4, 4, 3, 0)
又或者进一步,我们只计算交集部分:
A和B的交集部分:
A:{1:3, 2:4, 4:3} = (3, 4, 3)
B:{1:2, 2:4, 4:3} = (2, 4, 3)
计算A和C的交集部分:
A:{2:4, 4:3, 5:3} = (4, 3, 3)
C:{2:4, 4:2, 5:4} = (4, 2, 4)

不论哪种情况,用这个方法都能计算出结果,但是我觉得正因为它的这种通用性导致了它并没有针对性,一些数据的计算可能就有些偏差,比如,如果是下面的这组数据
A = (1, 2, 0, 2, 1)
B = (2, 4, 0, 4, 2)
显然是存在着线性关系,说明两者的评分标准其实是很相似的,但是如果用欧式距离来计算就忽略了这种关系。

猜你喜欢

转载自deepfuture.iteye.com/blog/1396841
今日推荐