给定稀疏的矩阵列表,计算矩阵中各列(或行)之间的余弦相似度的最佳方法是什么?我宁愿不重复两次选择。
说输入矩阵为:
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()