Python中调整后的余弦相似度

时间:2018-02-23 05:42:46

标签: python machine-learning recommendation-engine

参考此link

计算调整后的余弦相似度矩阵(给定m个用户和n个项目的评级矩阵M)如下:

M_u = M.mean(axis=1)    
item_mean_subtracted = M - M_u[:, None]    
similarity_matrix = 1 - squareform(pdist(item_mean_subtracted.T, 'cosine'))

根据definition

,我无法看到'符合'条件的情况如何得到满足

我手动计算了调整后的余弦相似度,它们似乎与上面代码中的值不同。

有人可以澄清这个吗?

1 个答案:

答案 0 :(得分:1)

让我们首先尝试理解配方,存储矩阵使得每一行都是用户,每列都是一个项目。用户由u索引,列由i。索引。

每个用户都有不同的判断规则,即某事物的好坏程度。来自用户的1可以是来自另一用户的3。这就是为什么我们从每个R_ {u,i}中减去每个R_u的平均值。这是在代码中以item_mean_subtracted计算的。请注意,我们通过行均值减去每个元素,以规范用户的偏好。之后,我们通过将每列除以其范数来标准化每个列(项),然后计算每列之间的余弦相似度。

pdist(item_mean_subtracted.T,'cosine')计算项目之间的余弦距离,并且已知

  

余弦相似度= 1-余弦距离

因此这就是代码的工作原理。

现在,如果我直接根据定义计算它会怎么样?我已经评论了每个步骤中执行的操作,尝试复制并粘贴代码,您可以通过打印更多中间步骤来与计算进行比较。

import numpy as np
from scipy.spatial.distance import pdist, squareform
from numpy.linalg import norm

M = np.asarray([[2, 3, 4, 1, 0], 
                [0, 0, 0, 0, 5], 
                [5, 4, 3, 0, 0], 
                [1, 1, 1, 1, 1]])

M_u = M.mean(axis=1)
item_mean_subtracted = M - M_u[:, None]
similarity_matrix = 1 - squareform(pdist(item_mean_subtracted.T, 'cosine'))
print(similarity_matrix)

#Computing the cosine similarity directly
n = len(M[0]) # find out number of columns(items)
normalized = item_mean_subtracted/norm(item_mean_subtracted, axis = 0).reshape(1,n) #divide each column by its norm, normalize it
normalized = normalized.T #transpose it
similarity_matrix2 = np.asarray([[np.inner(normalized[i],normalized[j] ) for i in range(n)] for j in range(n)]) # compute the similarity matrix by taking inner product of any two items
print(similarity_matrix2)

两个代码都给出了相同的结果:

[[ 1.          0.86743396  0.39694169 -0.67525773 -0.72426278]
 [ 0.86743396  1.          0.80099604 -0.64553225 -0.90790362]
 [ 0.39694169  0.80099604  1.         -0.37833504 -0.80337196]
 [-0.67525773 -0.64553225 -0.37833504  1.          0.26594024]
 [-0.72426278 -0.90790362 -0.80337196  0.26594024  1.        ]]