1

Ich bin interessiert Logarithmus von Zähldaten zu nehmen, die ich von countvectorizing Textdaten erhalten habe. Ich würde gerne testen, ob diese Transformation (Normalisierung) helfen würde, die Leistung eines Modells in Sklearn zu verbessern. DieseLogarithmus für Werte in einer Matrix im komprimierten dünnen Zeilenformat (csr_matrix) nehmen

ist, was ich habe:

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] 

Wie ich diesen Code ausführen, jedoch erhalte ich einen Fehler:

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 

Obwohl ich keine Hoffnung hatte, dass dies, ich konnte nicht wirklich funktionieren Denken Sie nicht an einen Weg, Logarithmen für Werte in einer CSR-Matrix zu nehmen. Ich habe versucht,

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] 

Diese

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

erzeugt Gibt es eine Möglichkeit, dies zu lösen? Vielen Dank für Ihre Hilfe.

Antwort

1

Sie müssen nur die spärliche Matrix X zu einer dichten Anordnung durch die todense() Methode konvertieren und dann broadcasting NumPy die Verwendung den Logarithmus zu berechnen:

X = np.log(1 + X) 

Wenn X ist riesig, es zu einer dichten Matrix konvertieren kann erschöpfen Sie Ihr RAM. In diesem Fall ist die Methode Ihr Freund, da er auf dünn besetzten Matrizen arbeitet:

X = X.log1p() 
+0

Vielen Dank !! – achimneyswallow

+0

Würdest du bitte meine Antwort akzeptieren, indem du auf die Schaltfläche "Akzeptieren" klickst, damit ich dir eine Gutschrift für deine Hilfe geben kann? Es ist ein höfliches Signal an andere, dass das Problem behoben ist und du bekommst +2 Wiederholungen. – Tonechas

+0

Natürlich ist es genau das Richtige! :) – achimneyswallow