$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
答案 0 :(得分:10)
首先,这不是错误。这是一个警告。下次执行此操作(在会话中)时,它将在没有警告的情况下执行此操作。
对我来说,信息很明确:
tdm
csr_matrix
是lil_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要快。