python - Scipy 稀疏矩阵在余弦相似度方面内存效率不高

标签 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)

一个 rune 的输出是:

1's percentage 0.0499615
memory percentage 0.91799018

最佳答案

将@hpaulj 的评论阐述为答案:

cosine_similarity 的两次调用都返回相同的基础数据。该余弦相似度矩阵大部分不为零,因此使用稀疏格式不会节省空间。

大部分为零的输入数据不一定(甚至通常)会产生大部分为零的余弦相似度矩阵。 Cosine(i,j) = 0 仅在矩阵的一对行 (i, j) 的任何相同列中没有值的情况下出现 (*)。

(* 或者如果点积结果为 0,但这是这里的一个侧面。)

关于python - Scipy 稀疏矩阵在余弦相似度方面内存效率不高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53706095/

相关文章:

python - 在音频中检测音频[音频识别]

Python:可以将解码项与原始行号相关联的JSON解码库?

algorithm - 生成一个不在给定的四十亿中的整数

python - python中的random.normalvariate()和random.gauss()有什么区别?

python - 不同长度的 tf-idf 文档

二维数组的 Python Earth Mover 距离

python - 使用 Scipy 进行图像腐 eclipse 和膨胀

python - 如何解决溢出错误: math range error

sql-server - 将 600MB 文件作为文件流数据插入 SQL Server Express 时出现内存不足错误

ubuntu - ubuntu服务器上的Laravel内存不足错误