(数据挖掘-入门-2)相似度衡量的方法

主要内容:

1、距离度量

2、皮尔逊关系系数

3、cosine相似度

4、方法的选择

1、距离度量

距离度量是最简单的衡量相似度的方法,公式如下:

当r=1时,为曼哈顿距离(manhattan distance);

当r=2时,为欧几里得距离(Euclidean distance);

优点:简单

缺点:当数据某些属性或特征缺失时,该度量结果不准确

代码:

def minskowski(rating1,rating2,r):
    distance=0
    commonRatings=Flase
    for key in rating1:
        for key in rating2:
            distance+=pow(abs(rating1[key]-rating2[key]),r)
            commonRatings=True
    if commonRatings:
        return pow(distance,1/r)
    else:
        return 0 #indicates no ratings in common

2、皮尔逊关系系数(Pearson Correlation Coefficient)

有时候,每个人的判断标准不一样,例如在给物品打分(1-5)时,有的人的打分范围为4-5,而有的人为1-5,而他们其实的评价结果是一样的。

但如果通过上述的距离度量的话,那么这两个人的相似度则会相差甚远,因此需要一种类似归一化的方法来解决。

公式如下:

r范围为-1~1

在实际代码实现中,也可以写成下面的形式,这样子就只需要遍历一遍数据即可。

代码:

def pearson(rating1, rating2):
    sum_xy = 0
    sum_x = 0
    sum_y = 0
    sum_x2 = 0
    sum_y2 = 0
    n = 0
    for key in rating1:
        if key in rating2:
            n += 1
            x = rating1[key]
            y = rating2[key]
            sum_xy += x * y
            sum_x += x
            sum_y += y
            sum_x2 += pow(x, 2)
            sum_y2 += pow(y, 2)
    # now compute denominator
    denominator = sqrt(sum_x2 - pow(sum_x, 2) / n) * sqrt(sum_y2 - pow(sum_y, 2) / n)
    if denominator == 0:
        return 0
    else:
        return (sum_xy - (sum_x * sum_y) / n) / denominator
  

3、cosine 相似度

在距离度量中提到,特征空间往往都是稀疏的,如果通过距离去度量相似性的话,会出现不准确的结果。

因此,cosine相似度计算可以解决这个问题,因为它会忽略0值的计算,公式如下:

代码:

def cosine(rating1, rating2):
    sum_xy = 0
    sum_x2 = 0;
    sum_y2 = 0
    for key in rating1:
        sum_x += rating1[key] * rating1[key]
    for key in rating2:
        sum_y += rating2[key] * rating2[key]
    for key in rating1:
        for key in rating2:
            sum_xy += rating1[key] * rating2[key]
    
    denominator = sqrt(sum_x2) * sqrt(sum_y2)
    if denominator == 0:
        return 0
    else:
        return sum_xy / denominator

4、方法的选择

如果数据是密集dense,那么可以用距离度量;

如果数据是稀疏的sparse,那么可以用cosine度量;

如果数据尺度不一致,那么可以用pearson度量;

原文地址:https://www.cnblogs.com/AndyJee/p/4852004.html