2016-07-25 3 views
2

행렬 사이의 파이썬에서 코사인 거리를 계산하고 몇 개의 질문이 있습니다. 행렬 matr을 작성하고 목록에서 채우고 다음을 위해 다시 채 웁니다. 분석 목적 :행렬 사이의 코사인 거리 계산

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 패키지를 사용하려면 :

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의 출력이 날처럼 떨어지게 제공 d 행렬 어떻게 수행 할 수 있습니까? 그것에 대한 루프가 있어야합니까? 행렬 및 배열 작업에 대한 경험이 많지 않습니다. 내가 두 번째 인수에 대한 루프를 위해 사용할 수있는 방법에 따라서

(D [1], d는 [2] 등)이 건축에 매번 시작하지 :

from scipy.spatial.distance import cosine 
x=cosine (d[0], d[6]) 
+0

해당 패키지에는 'pairwise'기능이 없습니까? – hpaulj

+0

두려워하지 않는데 - cosine을 사용하여 2 차원 배열을 입력으로 사용합니다 : cosine (u, v), 여기서 u, v-1-D 배열. – HalfPintBoy

+0

numpy를 사용하고 있습니까? –

답변

3

그냥 scipy.spatial.distance.cosine과 간단한 for 루프를 사용할 수 있습니다 참조 :

여기
dists = [] 
for row in matr: 
    dists.append(scipy.spatial.distance.cosine(matr[0,:], row)) 
7

당신이 말한 "을 계산 첫 행에서부터 다른 행렬까지의 코사인 "[sic]. 내가 제대로 이해한다면, 당신은 첫 번째 인수로 첫 번째 행을 통과, 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을 사용할 수 있습니다. pdist 의해 반환 처음 다섯 개 cdist 값을 이용하여 상기 리턴 동일한 값임을 예컨대

,

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의 반환 값의 자세한 설명은

How does condensed distance matrix work? (pdist)

+0

그 대답은 잘못된 것 같지 않습니까? 나는 모든 '자기'비교를 위해 거리가 '0'이 될 것으로 기대한다. –

+0

@TasosPapastylianou'pdist'에 의해 계산 된 결과에는 '자체'비교가 포함되지 않습니다. 답안 끝에 제공 한 링크의 설명을 참조하십시오. –

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에 대한 행 3 (또는 동일하게, 행 3에 대한 행 2)에 대한 코사인 거리는 0.15"로 해석됩니다.