在python中,是否有一种矢量化的有效方法来计算稀疏数组u
与稀疏矩阵v
的余弦距离,从而得到与[1, 2, ..., n]
对应的元素数组cosine(u,v[0]), cosine(u,v[1]), ..., cosine(u, v[n])
{1}}?
答案 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 库:
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)
在scipy.spatial.distance.cosine()
中http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.spatial.distance.cosine.html
答案 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 维的向量