【问题标题】:Cosine distance of vector to matrix向量到矩阵的余弦距离
【发布时间】:2016-08-23 13:09:04
【问题描述】:

在python中,有没有一种向量化的高效方法来计算稀疏数组u到稀疏矩阵v的余弦距离,从而得到一个元素数组[1, 2, ..., n]对应cosine(u,v[0]), cosine(u,v[1]), ..., cosine(u, v[n])

【问题讨论】:

标签: python vectorization cosine-similarity


【解决方案1】:

不是本地的。但是,您可以使用库 scipy,它可以为您计算两个向量之间的余弦距离:http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.spatial.distance.cosine.html。您可以构建一个使用矩阵作为垫脚石的版本。

【讨论】:

  • 是的,但这需要遍历行。如果可以的话,我想避免这种情况,因为我有很多行。不过会试一试。
  • @David:你找到避免迭代行的方法了吗?我也面临同样的问题
  • @Luk:不幸的是从未解决它,最终迭代了所有行 - 花了很长时间。
【解决方案2】:

将向量添加到矩阵的末尾,使用sklearn.metrics.pairwise_distances() 计算成对距离矩阵,然后提取相关的列/行。

所以对于向量v(形状为(D,))和矩阵m(形状为(N,D)):

import sklearn
from sklearn.metrics import pairwise_distances

new_m = np.concatenate([m,v[None,:]], axis=0)
distance_matrix = sklearn.metrics.pairwise_distances(new_m, axis=0), metric="cosine")
distances = distance_matrix[-1,:-1]

不理想,但比迭代更好!

如果您要查询多个向量,则可以扩展此方法。为此,可以改为连接向量列表。

【讨论】:

    【解决方案3】:

    我认为有一种方法可以使用定义和 numpy 库:

    定义:

    import numpy as np
    
    #just creating random data
    u = np.random.random(100)
    v = np.random.random((100,100))
    
    #dot product: for every row in v, multiply u and sum the elements
    u_dot_v = np.sum(u*v,axis = 1)
    
    #find the norm of u and each row of v
    mod_u = np.sqrt(np.sum(u*u))
    mod_v = np.sqrt(np.sum(v*v,axis = 1))
    
    #just apply the definition
    final = 1 - u_dot_v/(mod_u*mod_v)
    
    #verify with the cosine function from scipy
    from scipy.spatial.distance import cosine
    final2 = np.array([cosine(u,i) for i in v])
    

    余弦距离的定义我在这里找到:https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html#scipy.spatial.distance.cosine

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      以下为我工作,必须提供正确的签名

      从 scipy.spatial.distance 导入余弦 def cosine_distances(embedding_matrix,extracted_embedding): 返回余弦(embedding_matrix,extracted_embedding) cosine_distances = np.vectorize(cosine_distances, 签名='(m),(d)->()') 余弦距离(语料库嵌入,提取嵌入)

      就我而言
      corpus_embeddings 是一个 (10000,128) 矩阵
      extract_embedding 是一个 128 维的向量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-29
        • 2015-12-17
        • 1970-01-01
        • 2022-07-19
        • 2014-09-30
        • 2020-01-14
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多