以压缩稀疏行格式 (csr_matrix) 对矩阵中的值取对数

Posted

技术标签:

【中文标题】以压缩稀疏行格式 (csr_matrix) 对矩阵中的值取对数【英文标题】:Take logarithm for values in a matrix in Compressed Sparse Row format (csr_matrix) 【发布时间】:2016-12-05 06:29:48 【问题描述】:

我有兴趣对从计数向量化文本数据中获得的计数数据取对数。我很想测试这种转换(标准化)是否有助于提高 sklearn 中模型的性能。

这就是我所拥有的:

TEXT = [data[i].values()[3] for i in range(len(data))]

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(min_df=0.01,max_df = 2.5, lowercase = False, stop_words = 'english')

X = vectorizer.fit_transform(TEXT)
X = [math.log(i+1) for i in X]

然而,当我运行这段代码时,我得到一个错误:

File "nlpQ2.py", line 29, in <module>
X = [math.log(i+1) for i in X]
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 337, in __add__
raise NotImplementedError('adding a nonzero scalar to a '
NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported

虽然我不希望这会真正起作用,但我想不出一种方法来对 CSR 矩阵中的值取对数。我试过了

import math
import numpy as np
from scipy.sparse import csr_matrix

A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])

[math.log(i+1) for i in A]

这会生成

NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported

有没有办法解决这个问题?非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

你只需要将稀疏矩阵X通过todense()方法转换为密集数组,然后使用NumPy的broadcasting计算对数即可:

X = np.log(1 + X)

如果X 很大,将其转换为密集矩阵可能会耗尽您的 RAM。在这种情况下,log1p() 方法是您的朋友,因为它在稀疏矩阵上运行:

X = X.log1p()

【讨论】:

您能否考虑通过单击接受按钮来接受我的回答,以便我获得帮助您的功劳?这是对其他人的礼貌信号,表明问题已得到解决,您将获得 +2 代表。

以上是关于以压缩稀疏行格式 (csr_matrix) 对矩阵中的值取对数的主要内容,如果未能解决你的问题,请参考以下文章

如何对存储为“压缩稀疏行”的矩阵进行稀疏矩阵索引?

python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

以可移植数据格式保存/加载 scipy sparse csr_matrix

将 scipy 稀疏矩阵存储为 HDF5

如何将块压缩行转换为密集矩阵?

对稀疏 scipy 矩阵进行切片以对每 10 行和每列进行二次采样