【问题标题】:How to find similarity distance between vector and matrix (matrices that are not the same size) in python?如何在python中找到向量和矩阵(大小不同的矩阵)之间的相似距离?
【发布时间】:2020-11-18 13:20:32
【问题描述】:

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

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)

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

如果是代码有什么问题?

【问题讨论】:

    标签: python numpy dot-product


    【解决方案1】:

    虽然上面的答案正确,但它仅适用于第一个维度正好为 1 的矩阵。使用user_normalized (user_normalized.T) 的转置将适用于更多维度。

    所以,简短的回答是:使用

    distances = np.dot(movie_content, user_normalized.T)
    

    更复杂的答案是,如果X 的第二个维度与Y 的第一个维度匹配,即X 的形状为@,则仅针对XY 两个矩阵定义点积987654329@ 和 Y 的形状为 (N, D)。点积的结果是一个新的矩阵,维度为(M, D)

    在您的情况下,您有一个 (27278, 20) 矩阵和一个 (1, 20) 矩阵。转置将(1, 20)矩阵变成(20, 1)矩阵,从而满足点积的条件。最终结果是一个(27278, 1) 矩阵,其中每个单元格包含第 N 个电影和第 D 个用户的乘积。

    【讨论】:

      【解决方案2】:

      您需要将向量重塑为(-1, 1)。如果你想取两个形状为(m, k)(t, n) 的数组的点积,那么k 必须等于t。由于 numpy 中没有向量的概念,因此您基本上有一个形状为(27278, 20)(movie_content)的数组和另一个形状为(1, 20)(user_normalized)的数组。为了能够获取点积,您必须重新调整 user_normalized 数组以调整 (20, 1) 的形状,使 dot 产品的 movie_content 和 user_normalized 数组“对齐”(这是 numpy 喜欢这样称呼的)。

      因此,您的代码将如下所示

      import numpy as np
      
      distances = np.dot(movie_content, user_normalized[1].reshape(-1, 1))
      

      编辑:此解决方案仅在 user_normalized 是向量时有效。如果 user_normalized 是一个矩阵,则需要转置它。请参阅@amdex 对这种情况的回答。

      【讨论】:

      • 这个答案有效,但在一般情况下是不正确的,因为上面代码中的k == t。转置是正确的答案。
      猜你喜欢
      • 2020-11-17
      • 2020-03-13
      • 2015-08-28
      • 2011-08-08
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      相关资源
      最近更新 更多