参考此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'))
,我无法看到'符合'条件的情况如何得到满足
我手动计算了调整后的余弦相似度,它们似乎与上面代码中的值不同。
有人可以澄清这个吗?
答案 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. ]]