1. ホーム
  2. python

疎な行列データからコサイン類似度を計算するPythonの最速の方法は何ですか?

2023-08-22 08:42:04

質問

疎な行列のリストが与えられたとき、行列の各列(または行)の間のコサイン類似度を計算する最良の方法は何でしょうか?私はむしろn-choose-2回反復しないようにしたい。

入力行列があるとします。

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では、matrix-input形式を扱うのは簡単です。

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()