【问题标题】:Scipy sparse matrices are not memory efficient in cosine similarityScipy 稀疏矩阵在余弦相似度中的内存效率不高
【发布时间】:2018-12-10 12:53:52
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • similarities 是 92%“满”
  • 您的A 过于密集,无法产生稀疏相似性。每行平均有 50 个 1,您仍然很有可能获得非零相似性。试试&lt;.005,你会看到不同。

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


【解决方案1】:

将@hpaulj 的 cmets 详细说明为答案:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2020-11-05
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多