반응형
희소 행렬 목록이 주어지면 행렬의 각 열 (또는 행) 간의 코사인 유사성을 계산하는 가장 좋은 방법은 무엇입니까? 나는 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
반응형
'파이썬' 카테고리의 다른 글
파이썬으로 파일을 unrar 어떻게 할 수 있습니까? (0) | 2021.01.13 |
---|---|
파이썬 Python에서 목록의 요소 위치를 찾는 방법은 무엇입니까? (0) | 2021.01.13 |
파이썬 int 값을 유니 코드로 변환 (0) | 2021.01.13 |
파이썬 부울을 반환하려고 할 때 TypeError ( " 'bool'object is not iterable",) (0) | 2021.01.13 |
파이썬 이미지에서 텍스트 인식을위한 간단한 파이썬 라이브러리 (0) | 2021.01.13 |
댓글