更改列时的稀疏效率警告

时间:2015-10-12 22:45:16

标签: python numpy scipy nlp

$z

我想在tdm矩阵中为某些术语手动设置零权重。使用上面的代码我收到警告。我似乎不明白为什么?有更好的方法吗?

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

2 个答案:

答案 0 :(得分:10)

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

对我来说,信息很明确:

tdm

csr_matrixlil_matrix。数据以格式存储的方式,将一堆元素设置为0(或v.v将它们从0更改)需要相当多的额外计算。如上所述,如果您需要经常进行此类更改,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) ),我找到了代码

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

SciPy的/稀疏/ base.py

Warning

这些警告使用标准的Python <style> a {color: red;} </style> 类,因此用于控制其表达式的标准Python方法适用。

答案 1 :(得分:10)

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

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

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

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

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

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