向量与矩阵的余弦距离

时间:2016-04-28 16:19:30

标签: python vectorization cosine-similarity

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

将向量添加到矩阵的末尾,使用 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]

不理想,但比迭代好!

如果您要查询多个向量,则可以扩展此方法。为此,可以串联一个向量列表。

答案 2 :(得分:1)

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

定义:Definition:

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

答案 3 :(得分:0)

答案 4 :(得分:0)

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

from scipy.spatial.distance import cosine

def cosine_distances(embedding_matrix, extracted_embedding):
  return cosine(embedding_matrix, extracted_embedding)
cosine_distances = np.vectorize(cosine_distances, signature='(m),(d)->()')

cosine_distances(corpus_embeddings, extracted_embedding)

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