更改列时的稀疏效率警告

Abh*_*tia 8 python nlp numpy scipy

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
Run Code Online (Sandbox Code Playgroud)

我想在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)
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 12

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

对我来说,信息很明确:

Changing the sparsity structure of a csr_matrix is expensive. 
lil_matrix is more efficient.
Run Code Online (Sandbox Code Playgroud)

tdm是一个csr_matrix.数据以格式存储的方式,需要相当多的额外计算才能将一堆元素设置为0(或vv将它们从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)
Run Code Online (Sandbox Code Playgroud)

SciPy的/稀疏/ base.py

class SparseWarning(Warning):
    pass
class SparseFormatWarning(SparseWarning):
    pass
class SparseEfficiencyWarning(SparseWarning):
    pass
Run Code Online (Sandbox Code Playgroud)

这些警告使用标准Python Warning类,因此适用于控制其表达式的标准Python方法.


小智 11

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

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

到目前为止,最快的方法是使用np.zeros()初始化密集矩阵,然后在最后执行一次csr_matrix(dense_matrix),以此为代价,在此期间使用相当多的内存. .

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

最慢的方法是按元素组装csr_matrix元素.

总而言之,如果你有足够的工作记忆来构建一个密集矩阵,并且只想稍后用一个稀疏矩阵来获得下游效率,那么以密集格式构建矩阵然后将其转换为一次可能会更快在末尾.如果由于内存限制需要一直以稀疏格式工作,将矩阵构建为lil_matrix然后转换它(如在接受的答案中)比从一开始构建csr_matrix更快.