【问题标题】:Cosine similarity between two ndarrays两个ndarrays之间的余弦相似度
【发布时间】:2018-09-27 15:30:46
【问题描述】:

我有两个 numpy 数组,第一个数组大小为 100*4*200,第二个数组大小为 150*6*200。事实上,我在数组 1 中存储了 4 个字段的 200 维向量表示的 100 个样本,在数组 2 中存储了 6 个字段的 200 维向量的 140 个样本。

现在我想计算样本之间的相似度向量并创建一个相似度矩阵。对于每个样本,我想计算每个字段组合之间的相似性并将其存储起来,以便得到一个 15000*24 维数组。

前 150 行将是数组 1 的第 1 行和数组 2 的 150 行之间的相似度向量,接下来的 150 行将是数组 1 的第 2 行和数组 2 的 150 行之间的相似度向量,依此类推。 每个相似度向量是数组 1 中的 # 个字段 * 数组 2 中的 # 个字段,即相似度向量的第一个元素是数组 1 的字段 1 和数组 2 的字段 1 之间的余弦相似度,第二个元素将是数组 1 的字段 1 之间的相似度和数组2的字段2,以此类推,最后一个元素是数组1的最后一个字段和数组2的最后一个字段的相似度。

使用 numpy 数组执行此操作的最佳方法是什么?

【问题讨论】:

  • 如果可以使用sklearn take a look at this.
  • @StefanFalk 我不确定它是否回答了这个问题。我需要找到每个字段的向量之间的余弦相似度。我的数组是 (m,n,k) 维度而不是 (m,n) 数组

标签: python arrays python-2.7 numpy


【解决方案1】:

所以每个“行”(我假设第一个轴,我称之为轴 0)都是样本轴。这意味着您有来自一个向量的 100 个样本,每个样本都有 fieldsxdimentions 4x200。

按照您描述的方式执行此操作,那么第一个数组的第一行将具有 (4,200),而第二行将具有 (150,6,200)。然后你想在(m,n)(m,n,k) 数组之间做一个cos 距离,这是没有意义的(这里最接近点积的是张量积,我相当肯定不是你想要的)。

所以我们必须先提取这些,然后遍历所有其他的。

为此,我实际上建议使用 np.split 拆分数组并遍历它们。这只是因为我从来没有在 numpy 中遇到过更快的方法。您可以使用 tensorflow 来提高效率,但我不会在我的回答中讨论这个问题。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
a = np.random.rand(100, 4, 200)
b = np.random.rand(150, 6, 200)
# We know the output will be 150*100 x 6*4
c = np.empty([15000, 24])

# Make an array with the rows of a and same for b
a_splitted=np.split(a, a.shape[0], 0)
b_splitted=np.split(b, b.shape[0], 0)
i=0
for alpha in a_splitted:
    for beta in b_splitted:
        # Gives a 4x6 matrix
        sim=cosine_similarity(alpha[0],beta[0])
        c[i,:]=sim.ravel()
        i+=1

对于上面的similarity-函数,我只是选择了@StefanFalk 建议的:sklearn.metrics.pairwise.cosine_similarity。如果这种相似性度量还不够,那么您可以自己编写。

我根本没有声称这是在所有 python 中执行此操作的最佳方法。我认为最有效的方法是象征性地使用tensorflow

不管怎样,希望对你有帮助!

【讨论】:

  • 谢谢。我主要关心的是加速。你认为使用 tensorflow 会让我得到更快的结果吗?如果您不介意,您可以分享基于 tensorflow 的解决方案吗?
  • 是的。如果我有时间的话,我明天可能会在 tensorflow 中为你做这个:)
猜你喜欢
  • 2018-08-19
  • 2020-10-28
  • 2020-04-21
  • 2011-02-01
  • 2015-07-21
  • 2021-10-07
  • 2017-04-04
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多