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

2024-06-14 07:05:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

Tags: inforindexnamesisdefmatrixfeature
2条回答

我在处理机器学习问题的同时也遇到了这个警告信息。确切的应用是从一个文本语料库中构造一个文档术语矩阵。我同意接受的答案。我将添加一个经验观察:

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

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

第二种最快的方法是建立一个lil_矩阵,然后使用.to csr()方法将其转换为csr_矩阵。在接受的答案中建议这样做。(谢谢你。

最慢的方法是逐个组装csr_矩阵元素。

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

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

对我来说,这个信息很清楚:

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

tdm是一个csr_matrix。以这种格式存储数据的方式,将一组元素设置为0(或将它们从0更改为v.v)需要相当多的额外计算。正如它所说,如果需要经常进行这种更改,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/稀疏/base.py

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

这些警告使用标准PythonWarning类,因此应用标准Python方法来控制它们的表达式。

相关问题 更多 >