Возьмите логарифм для значений в матрице в формате Compressed Sparse Row (csr_matrix)

Я заинтересован в том, чтобы взять логарифм данных подсчета, которые я получил при подсчете текстовых данных. Я хотел бы проверить, поможет ли это преобразование (нормализация) улучшить производительность модели в 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 для вычисления логарифма:

X = np.log(1 + X)

Если X огромен, преобразование его в плотную матрицу может исчерпать вашу оперативную память. В этом случае метод log1p() Ваш друг, поскольку он работает с разреженными матрицами:

X = X.log1p()
Другие вопросы по тегам