计算矩阵行

时间:2016-07-25 16:38:22

标签: python numpy matrix scipy cosine

我试图在矩阵中的行之间计算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])

3 个答案:

答案 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"