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)
我在处理机器学习问题的同时也遇到了这个警告信息。确切的应用是从一个文本语料库中构造一个文档术语矩阵。我同意接受的答案。我将添加一个经验观察:
我的确切任务是建立一个25000x 90000的uint8矩阵。 我想要的输出是稀疏矩阵压缩行格式,即csr_矩阵。
到目前为止,最快的方法是使用np.zeros()初始化一个稠密矩阵,然后构建它,最后再执行一次csr_矩阵(稠密矩阵)。
第二种最快的方法是建立一个lil_矩阵,然后使用.to csr()方法将其转换为csr_矩阵。在接受的答案中建议这样做。(谢谢你。
最慢的方法是逐个组装csr_矩阵元素。
综上所述,如果您有足够的工作内存来构建一个密集矩阵,并且只想在稍后以稀疏矩阵结束以获得下游效率,那么以密集格式构建矩阵并在最后将其转换一次可能会更快。如果由于内存限制,您需要一直以稀疏格式工作,那么将矩阵构建为lil_矩阵,然后将其转换(如接受的答案所示)比从一开始就构建csr_矩阵要快。
首先,这不是一个错误。这是个警告。下次执行此操作(在会话中)时,它将在没有警告的情况下执行此操作。
对我来说,这个信息很清楚:
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
)中,我发现scipy/稀疏/base.py
这些警告使用标准Python
Warning
类,因此应用标准Python方法来控制它们的表达式。相关问题 更多 >
编程相关推荐