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

时间:2016-07-30 18:52:09

标签: numpy scikit-learn normalization sparse-matrix transformation

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

这就是我所拥有的:

> (time (edit-distance i1 i2))
"Elapsed time: 27.782828 msecs"
291

但是,当我运行此代码时,我收到错误:

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]

虽然我不希望这实际上有效,但我无法想出一种在CSR矩阵中采用对数值的方法。我试过了

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

这会生成

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]

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

1 个答案:

答案 0 :(得分:1)

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

X = np.log(1 + X)

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

X = X.log1p()