更改列时出现稀疏效率警告

Sparse Efficiency Warning while changing the column

def tdm_modify(feature_names,tdm):
    non_useful_words=['kill','stampede','trigger','cause','death','hospital'\
        ,'minister','said','told','say','injury','victim','report']
    indexes=[feature_names.index(word) for word in non_useful_words]
    for index in indexes:
        tdm[:,index]=0   
    return tdm

我想为 tdm 矩阵中的某些项手动设置零权重。使用上面的代码我得到了警告。我好像不明白为什么?有更好的方法吗?

C:\Anaconda\lib\site-packages\scipy\sparse\compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)

首先,这不是错误。这是一个警告。下次您执行此操作(在会话中)时,它将在没有警告的情况下执行。

对我来说,信息很明确:

Changing the sparsity structure of a csr_matrix is expensive. 
lil_matrix is more efficient.

tdm 是一个 csr_matrix。数据以格式存储的方式,需要相当多的额外计算才能将一堆元素设置为 0(或 v.v 将它们从 0 更改)。正如它所说,如果您需要经常进行此类更改,lil_matrix 格式会更好。

尝试对样本矩阵进行一些时间测试。 tdm.tolil() 会将矩阵转换为 lil 格式。

我可以了解数据的存储方式以及为什么更改 csr 的效率低于 lil

我建议查看 sparse 格式及其各自的优缺点。

一个简单的思考方式是——csr(和csc)是为快速数值计算而设计的,尤其是矩阵乘法。他们为线性代数问题而开发。 coo 是定义稀疏矩阵的便捷方式。 lil 是增量构建矩阵的便捷方式。

您最初是如何构建 tdm 的?


scipy 测试文件(例如 scipy/sparse/linalg/dsolve/tests/test_linsolve.py)中,我找到了

import warnings
from scipy.sparse import (spdiags, SparseEfficiencyWarning, csc_matrix,
    csr_matrix, isspmatrix, dok_matrix, lil_matrix, bsr_matrix)
warnings.simplefilter('ignore',SparseEfficiencyWarning)

scipy/sparse/base.py

class SparseWarning(Warning):
    pass
class SparseFormatWarning(SparseWarning):
    pass
class SparseEfficiencyWarning(SparseWarning):
    pass

这些警告使用标准 Python Warning class,因此适用标准 Python 方法来控制它们的表达。

我 运行 进入此警告消息以及处理机器学习问题。确切的应用是从文本语料库构建文档术语矩阵。我同意接受的答案。我将添加一项经验观察:

我的确切任务是构建一个 25000 x 90000 的 uint8 矩阵。 我想要的输出是稀疏矩阵压缩行格式,即 csr_matrix.

到目前为止最快的方法是使用 np.zeros() 初始化密集矩阵,构建它,然后执行 csr_matrix(dense_matrix) 最后一次。

第二快的方法是构建一个 lil_matrix,然后使用 .tocsr() 方法将其转换为 csr_matrix。这是在接受的答案中推荐的。 (谢谢 hpaulj)。

最慢的方法是 assemble csr_matrix 个元素。

综上所述,如果您有足够的工作内存来构建密集矩阵,并且只想在以后以稀疏矩阵结束以提高下游效率,那么以密集格式构建矩阵可能会更快然后在最后隐藏它一次。如果由于内存限制而需要一直以稀疏格式工作,将矩阵构建为 lil_matrix 然后将其转换(如在接受的答案中那样)比从 csr_matrix 构建矩阵更快开始。