我正在尝试使用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
答案 0 :(得分:0)
将@hpaulj的评论详细化为答案:
您对cosine_similarity
的调用均返回相同的基础数据。该余弦相似度矩阵通常不是零,因此使用稀疏格式不会节省空间。
大多数为零的输入数据不一定(或者甚至通常)产生一个大多数为零的余弦相似度矩阵。如果矩阵的一对行(i,j)在同一列中均没有值,则余弦(i,j)= 0仅会发生(*)。
(*或如果点积否则为0,但这是一个补充。)