我有一个用户“首选项”表的数据集,该表的一个实例如下所示: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)为了找到最优惠的电影,找到距离度量的正确方法是正确的吗?如果是代码有什么问题?
2 回答

偶然的你
TA贡献1841条经验 获得超3个赞
使用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
TA贡献1820条经验 获得超2个赞
您需要将矢量重塑为(-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))
添加回答
举报
0/150
提交
取消