본문 바로가기
파이썬

파이썬 What's the fastest way in Python to calculate cosine similarity given sparse matrix data?

by º기록 2021. 1. 13.
반응형

희소 행렬 목록이 주어지면 행렬의 각 열 (또는 행) 간의 코사인 유사성을 계산하는 가장 좋은 방법은 무엇입니까? 나는 n-choose-two 번 반복하지 않을 것입니다.

입력 행렬은 다음과 같습니다.

A= 
[0 1 0 0 1
 0 0 1 1 1
 1 1 0 1 0]

희소 표현은 다음과 같습니다.

A = 
0, 1
0, 4
1, 2
1, 3
1, 4
2, 0
2, 1
2, 3

Python에서는 행렬 입력 형식으로 작업하는 것이 간단합니다.

import numpy as np
from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import cosine

A = np.array(
[[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[1, 1, 0, 1, 0]])

dist_out = 1-pairwise_distances(A, metric="cosine")
dist_out

제공 :

array([[ 1.        ,  0.40824829,  0.40824829],
       [ 0.40824829,  1.        ,  0.33333333],
       [ 0.40824829,  0.33333333,  1.        ]])

풀 매트릭스 입력에는 괜찮지 만, 저는 희소 표현으로 시작하고 싶습니다 (행렬의 크기와 희소성 때문에). 이것이 최선의 방법에 대한 아이디어가 있습니까? 미리 감사드립니다.

 

해결 방법

 

sklearn을 사용하여 희소 행렬의 행에서 쌍별 코사인 유사성을 직접 계산할 수 있습니다. 버전 0.17부터는 희소 출력도 지원합니다.

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse

A =  np.array([[0, 1, 0, 0, 1], [0, 0, 1, 1, 1],[1, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
print('pairwise dense output:\n {}\n'.format(similarities))

#also can output sparse matrices
similarities_sparse = cosine_similarity(A_sparse,dense_output=False)
print('pairwise sparse output:\n {}\n'.format(similarities_sparse))

결과 :

pairwise dense output:
[[ 1.          0.40824829  0.40824829]
[ 0.40824829  1.          0.33333333]
[ 0.40824829  0.33333333  1.        ]]

pairwise sparse output:
(0, 1)  0.408248290464
(0, 2)  0.408248290464
(0, 0)  1.0
(1, 0)  0.408248290464
(1, 2)  0.333333333333
(1, 1)  1.0
(2, 1)  0.333333333333
(2, 0)  0.408248290464
(2, 2)  1.0

열 단위 코사인 유사성을 원한다면 입력 행렬을 미리 전치하기 만하면됩니다.

A_sparse.transpose()

 

참조 페이지 https://stackoverflow.com/questions/17627219

 

 

반응형

댓글