常用的相似度计算方法:(1)欧氏距离(2)余弦相似度 (3)皮尔逊相关系数 (4)修正余弦相似度(5)汉明距离 (6)曼哈顿距离

1、欧式距离:就是计算空间中两点的距离




hive cos相似度 cosine相似度计算方法_余弦相似度


def EuclideanDistance(x,y):
 d = 0
 for a,b in zip(x,y):
 d += (a-b)**2
 return d**0.5

2、余弦相似度(cosine)

夹角越小,余弦值越接近1,越相似


hive cos相似度 cosine相似度计算方法_jaccard相似度_02


def Cosine(x,y):
    sum_xy = 0.0;  
    normX = 0.0;  
    normY = 0.0;  
    for a,b in zip(x,y):  
        sum_xy += a*b  
        normX += a**2  
        normY += b**2  
    if normX == 0.0 or normY == 0.0:  
        return None  
    else:  
        return sum_xy / ((normX*normY)**0.5)


***欧式距离和夹角余弦的区别:夹角余弦反应的是二者之间的变动趋势,而欧式距离反应的是数值上的差距。所以这两种算法是不一致的。

欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异

3、皮尔逊相关系数(pearson correlation coefficient)


hive cos相似度 cosine相似度计算方法_jaccard相似度_03


hive cos相似度 cosine相似度计算方法_hive cos相似度_04


皮尔逊相关系数是余弦相似度在维度值缺失情况下的一种改进

余弦相似度的问题是: 其计算严格要求"两个向量必须所有维度上都有数值", 比如:
v1 = (1, 2, 4),
v2=(3, -1, null),
那么这两个向量由于v2中第三个维度有null, 无法进行计算.
然而, 实际我们做数据挖掘的过程中, 向量在某个维度的值常常是缺失的, 比如v2=(3, -1, null), v2数据采集或者保存中缺少一个维度的信息, 只有两个维度. 那么, 我们一个很朴素的想法就是, 我们在这个地方填充一个值, 不就满足了"两个向量必须所有维度上都有数值"的严格要求了吗? 填充值的时候, 我们一般这个向量已有数据的平均值, 所以v2填充后变成v2=(3, -1, 1), 接下来我们就可以计算cos<v1, v2>了.皮尔逊相关系数的思路是, 我把这些null的维度都填上0, 然后让所有其他维度减去这个向量各维度的平均值, 这样的操作叫作中心化. 中心化之后所有维度的平均值就是0了, 也满足进行余弦计算的要求. 然后再进行我们的余弦计算得到结果. 这样先中心化再余弦计得到的相关系数叫作皮尔逊相关系数.

4、修正余弦相似度


hive cos相似度 cosine相似度计算方法_余弦相似度_05


计算方法和 皮尔逊方法类似,只是,去中心化的方式不一样。皮尔森区中心化的方式,很好理解(减去的均值是 item的均值)。修正的余弦,减去的是(这个user 的评分均值)。


# 修正余弦相似度
# 修正cosine 减去的是对item i打过分的每个user u,其打分的均值  那下面的计算其实是错的
data = np.mat([[1,2,3],[3,4,5]])
avg = np.mean(data[:,0]) # 下标0表示正在打分的用户
def AdjustedCosine(dataA,dataB,avg):
    sumData = (dataA - avg) * (dataB - avg).T # 若列为向量则为 dataA.T * dataB
    denom = np.linalg.norm(dataA - avg) * np.linalg.norm(dataB - avg)
    return 0.5 + 0.5 * (sumData / denom)
print(AdjustedCosine(data[0,:],data[1,:],avg))

《Programming Collective Intelligence》读书笔记(2)--协同过滤wulc.me

hive cos相似度 cosine相似度计算方法_余弦相似度_06


5、汉明距离:《Programming Collective Intelligence》读书笔记(2)--协同过滤 5、汉明距离:

汉明距离就是两个相同长度的字符串,对应位不同的数量。比如“111111” 与“100001”汉明距离就是 4


def hammingDistance(x,y):
        hamming_dis = 0
        s = str(bin(x^y))
        print s,len(s)
        for i in range(2,len(s)):
                if int(s[i]) is 1:
                        hamming_dis +=1 
        return hamming_dis


def hammingDistance1(x,y):
        hamming_dis = 0
        s = ((x^y))
        print s ,bin(x),bin(y),
        while s:
                s &= (s-1)
                hamming_dis +=1
        
        return hamming_dis

print hammingDistance1(8,2)
print int('0b11',2)


6、曼哈顿距离

曼哈顿距离就是两个点在标准坐标系上的绝对轴距总和。


hive cos相似度 cosine相似度计算方法_余弦相似度_07


# 曼哈顿距离(Manhattan Distance)
def Manhattan(dataA,dataB):
 return np.sum(np.abs(dataA - dataB))
print(Manhattan(dataA,dataB))

7、Jaccard相似度


hive cos相似度 cosine相似度计算方法_jaccard相似度_08