pandas - 在 python 中计算余弦相似度给定的稀疏矩阵数据,最快的方法是?

给出一个稀疏矩阵列表,计算矩阵中各列(行或行)之间的余弦相似度的最好的方法什么?

输入矩阵为:


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. ]])

时间:

以下方法比scipy.spatial.distance.pdist快大约30倍。 它在大矩阵上运行非常快(假设你有足够的内存)

关于稀疏的优化问题,请参阅下面的讨论。


# base similarity matrix (all dot products)
# replace this with A.dot(A.T).todense() for sparse representation
similarity = numpy.dot(A, A.T)


# squared magnitude of preference vectors (number of occurrences)
square_mag = numpy.diag(similarity)

# inverse squared magnitude
inv_square_mag = 1 / square_mag

# if it doesn't occur, set it's inverse magnitude to zero (instead of inf)
inv_square_mag[numpy.isinf(inv_square_mag)] = 0

# inverse of the magnitude
inv_mag = numpy.sqrt(inv_square_mag)

# cosine similarity (elementwise multiply by inverse magnitudes)
cosine = similarity * inv_mag
cosine = cosine.T * inv_mag

你应该看看scipy.sparse (链接 ),就像使用普通矩阵一样,可以对稀疏矩阵应用操作。

...