Python中的调整余弦相似性

2024-09-27 07:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

指的是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如何满足“两个评级”条件

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

有人能澄清一下吗?在


Tags: 项目用户nonelink矩阵meanitemmatrix
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:47

让我们先来理解这个公式,矩阵的存储方式是每一行都是一个用户,每一列都是一个项。用户按u索引,列按i索引

每个用户对事物的好坏有不同的判断规则。一个用户的1可以是另一个用户的3。这就是为什么我们要从每个R{u,i}中减去每个R\u u u的平均值。这是在代码中减去项目“平均值”。注意,我们用每个元素的行平均值来规范化用户的偏见。然后,我们将每个列(项)除以其范数,然后计算每列之间的余弦相似性。在

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

cosine similarity = 1- cosine distance

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

现在,如果我直接根据定义来计算呢?我已经评论了每一步的执行情况,试着复制和粘贴代码,你可以通过打印出更多的中间步骤来与你的计算进行比较。在

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)

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

^{pr2}$

相关问题 更多 >

    热门问题