向量到矩阵的余弦距离
Cosine distance of vector to matrix
在python中,是否有一种向量化的有效方法来计算稀疏数组u
到稀疏矩阵v
的余弦距离,得到一个元素数组[1, 2, ..., n]
对应cosine(u,v[0]), cosine(u,v[1]), ..., cosine(u, v[n])
?
不是本地人。但是,您可以使用可以为您计算两个向量之间的余弦距离的库 scipy
:http://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
在python中,是否有一种向量化的有效方法来计算稀疏数组u
到稀疏矩阵v
的余弦距离,得到一个元素数组[1, 2, ..., n]
对应cosine(u,v[0]), cosine(u,v[1]), ..., cosine(u, v[n])
?
不是本地人。但是,您可以使用可以为您计算两个向量之间的余弦距离的库 scipy
:http://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