我试图在矩阵中的行之间计算python中的余弦距离并且有几个问题。所以我创建了矩阵矩阵并从列表中填充它,然后将其重新整形以用于分析目的: / p>
s = []
for i in range(len(a)):
for j in range(len(b_list)):
s.append(a[i].count(b_list[j]))
matr = np.array(s)
d = matr.reshape((22, 254))
d的输出给了我像:
array([[0, 0, 0, ..., 0, 0, 0],
[2, 0, 0, ..., 1, 0, 0],
[2, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[1, 0, 0, ..., 0, 0, 0]])
然后我想使用scipy.spatial.distance.cosine包来计算从第一行到d矩阵中所有其他值的余弦。 我该怎么做?它应该是一些循环吗?对矩阵和数组操作没有太多经验。
那么我怎样才能在第二个参数(d [1],d [2]等)中使用for循环,而不是每次都启动它:
from scipy.spatial.distance import cosine
x=cosine (d[0], d[6])
答案 0 :(得分:7)
你说“在d矩阵中从第一行到其他所有计算余弦”[原文如此]。如果我理解正确,您可以使用scipy.spatial.distance.cdist
执行此操作,将第一行作为第一个参数传递,将其余行作为第二个参数传递:
In [31]: from scipy.spatial.distance import cdist
In [32]: matr = np.random.randint(0, 3, size=(6, 8))
In [33]: matr
Out[33]:
array([[1, 2, 0, 1, 0, 0, 0, 1],
[0, 0, 2, 2, 1, 0, 1, 1],
[2, 0, 2, 1, 1, 2, 0, 2],
[2, 2, 2, 2, 0, 0, 1, 2],
[0, 2, 0, 2, 1, 0, 0, 0],
[0, 0, 0, 1, 2, 2, 2, 2]])
In [34]: cdist(matr[0:1], matr[1:], metric='cosine')
Out[34]: array([[ 0.65811827, 0.5545646 , 0.1752139 , 0.24407105, 0.72499045]])
如果您想在matr
中计算所有成对距离,则可以使用scipy.spatial.distance.pdist
。
例如,
In [35]: from scipy.spatial.distance import pdist
In [36]: pdist(matr, metric='cosine')
Out[36]:
array([ 0.65811827, 0.5545646 , 0.1752139 , 0.24407105, 0.72499045,
0.36039785, 0.27625314, 0.49748109, 0.41498206, 0.2799177 ,
0.76429774, 0.37117185, 0.41808563, 0.5765951 , 0.67661917])
请注意,pdist
返回的前五个值与上面使用cdist
返回的值相同。
有关pdist
的返回值的进一步说明,请参阅How does condensed distance matrix work? (pdist)
答案 1 :(得分:3)
您可以使用scipy.spatial.distance.cosine
的简单for循环:
dists = []
for row in matr:
dists.append(scipy.spatial.distance.cosine(matr[0,:], row))
答案 2 :(得分:1)
以下是您可以手动轻松计算的方法:
from numpy import array as a
from numpy.random import random_integers as randi
from numpy.linalg.linalg import norm
from numpy import set_printoptions
M = randi(10, size=a([5,5])); # create demo matrix
# dot products of rows against themselves
DotProducts = M.dot(M.T);
# kronecker product of row norms
NormKronecker = a([norm(M, axis=1)]) * a([norm(M, axis=1)]).T;
CosineSimilarity = DotProducts / NormKronecker
CosineDistance = 1 - CosineSimilarity
set_printoptions(precision=2, suppress=True)
print CosineDistance
输出:
[[-0. 0.15 0.1 0.11 0.22]
[ 0.15 0. 0.15 0.13 0.06]
[ 0.1 0.15 0. 0.15 0.14]
[ 0.11 0.13 0.15 0. 0.18]
[ 0.22 0.06 0.14 0.18 -0. ]]
这个矩阵是例如解释为"第3行与第2行之间的余弦距离(或者同样地,第2行与第3行)之间的余弦距离为0.15"