Scipy稀疏矩阵在余弦相似度方面的存储效率不高

时间:2018-12-10 12:53:53

标签: python scipy out-of-memory sparse-matrix

我正在尝试使用scipy稀疏矩阵实现余弦相似度,因为我在使用普通矩阵(非稀疏)时遇到内存错误。但是,我注意到,当输入矩阵(观测值)的大小很大时,稀疏和非稀疏矩阵的余弦相似性的内存大小(以字节为单位)几乎相同。我是在做错什么,还是有办法解决?这是代码,其中输入的5%为1,95%为0。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
A = np.random.rand(10000, 1000)<.05
A_sparse = sparse.csr_matrix(A)
similarities = cosine_similarity(A_sparse)

# output sparse matrices
similarities_sparse = cosine_similarity(A_sparse,dense_output=False)

print("1's percentage", np.count_nonzero(A)/np.size(A))
print('memory percentage', similarities_sparse.data.nbytes/similarities.data.nbytes)

一个符文的输出是:

1's percentage 0.0499615
memory percentage 0.91799018

1 个答案:

答案 0 :(得分:0)

将@hpaulj的评论详细化为答案:

您对cosine_similarity的调用均返回相同的基础数据。该余弦相似度矩阵通常不是零,因此使用稀疏格式不会节省空间。

大多数为零的输入数据不一定(或者甚至通常)产生一个大多数为零的余弦相似度矩阵。如果矩阵的一对行(i,j)在同一列中均没有值,则余弦(i,j)= 0仅会发生(*)。

(*或如果点积否则为0,但这是一个补充。)