1

我有興趣從countvectorizing文本數據中獲取計數數據的對數。我很想測試這種轉換(標準化)是否有助於提高sklearn模型的性能。以壓縮稀疏行格式(csr_matrix)的矩陣中的值取對數

這是我有:

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

你只需要通過todense()方法稀疏矩陣X轉換爲密集排列,然後用與NumPy的broadcasting來計算對數:

X = np.log(1 + X) 

如果X是巨大的,將其轉換爲密集矩陣可耗盡你的RAM。在這種情況下,方法log1p()是您的朋友,因爲它在稀疏矩陣上運行:

X = X.log1p() 
+0

非常感謝! – achimneyswallow

+0

您是否願意考慮通過點擊接受按鈕來接受我的答案,以便我可以獲得信貸幫助您?對其他人來說,這個問題已經解決,你會得到+2代表的禮貌信號。 – Tonechas

+0

當然,這是正確的做法! :) – achimneyswallow