向量到矩阵的余弦距离

Cosine distance of vector to matrix

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

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

在scipy.spatial.distance.cosine()

http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.spatial.distance.cosine.html

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

所以对于向量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]

不理想,但比迭代要好!

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

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

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) 矩阵
extracted_embedding是一个128维的向量

我认为有一种方法可以使用定义和 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