猿问

如何在python中找到向量和矩阵(大小不同的矩阵)之间的相似距离?

我有一个用户“首选项”表的数据集,该表的一个实例如下所示:


print(user_normalized[1].reshape(1, -1).shape)

print(user_normalized[1].reshape(1, -1))

___________________________________________________________________

(1, 20)

[[0.         0.00239107 0.00131709 0.         0.00355872 0.00212352

  0.00300639 0.00044287 0.001469   0.00358637 0.01520913 0.

  0.         0.         0.00174978 0.00237691 0.0026616  0.00241604

  0.         0.        ]]

这给了我第一个用户的偏好向量。


我有电影内容表的数据集:


print(movie_content.shape)

print(movie_content)

___________________________________________________________________

(27278, 20)

[[1 0 0 ... 0 0 0]

 [1 0 0 ... 0 0 0]

 [0 0 0 ... 0 0 0]

 ...

 [0 0 0 ... 0 0 0]

 [0 0 1 ... 0 0 0]

 [1 0 0 ... 0 0 0]]

我正在尝试获取用户偏好向量和电影内容表的点积,以便找到最优惠的电影(余弦相似度):


distances = np.dot(user_normalized[1], movie_content)

但这给了我以下错误:


ValueError: shapes (1,20) and (27278,20) not aligned: 20 (dim 1) != 27278 (dim 0)

为了找到最优惠的电影,找到距离度量的正确方法是正确的吗?


如果是代码有什么问题?


qq_笑_17
浏览 137回答 2
2回答

偶然的你

使用user_normalized( user_normalized.T) 的转置将适用于更多维。所以,简短的回答是:使用distances = np.dot(movie_content, user_normalized.T)更复杂的答案是,点积仅针对两个矩阵定义X,并且Y如果第二个维度与X第一个维度匹配Y,即X具有形状(M, N)和Y形状(N, D)。点积的结果是一个维度为 的新矩阵(M, D)。在您的情况下,您有一个(27278, 20)矩阵和一个(1, 20)矩阵。转置将(1, 20)矩阵变成(20, 1)矩阵,从而满足点积的条件。最终结果是一个(27278, 1)矩阵,其中每个单元格包含第 N 部电影和第 D 个用户的乘积。

DIEA

您需要将矢量重塑为(-1, 1). 如果要取两个形状数组的点积(m, k),(t, n)则k必须等于t. 由于在 numpy 中没有向量的概念,你基本上有一个形状数组(27278, 20)(movie_content) 和另一个形状数组(1, 20)(user_normalized)。为了能够获取点积,您必须重塑 user_normalized 数组的形状,(20, 1)使 movie_content 和 user_normalized 数组“对齐”(numpy 喜欢这样称呼它)作为dot产品。因此,您的代码看起来像import numpy as np distances = np.dot(movie_content, user_normalized[1].reshape(-1, 1))
随时随地看视频慕课网APP

相关分类

Python
我要回答