2017-01-11 6 views
2

Ich verwende scikit-learn preprocessing scaling für spärlich Matrizen.Skalieren (Funktion anwenden?) Spärlich Matrix logarithmisch

Mein Ziel ist es, jede Feature-Spalte zu "skalieren", indem der Logarithmus-Base der Spalten-Maximalwert genommen wird. Mein Wortlaut kann ungenau sein. Ich versuche es zu erklären.

Say Feature-Spalte Werte: 0, 8, 2:

  • Max-Wert = 8
  • Log-8 von Merkmalswert 0 sollte 0,0 = math.log(0+1, 8+1) sein (die 1 ist mit Nullen zu bewältigen, so ja sind wir tatsächlich log-Basis 9)
  • Log-8 von Merkmalswert unter 8 sollte 1,0 = math.log(8+1, 8+1)
  • Log-8 von Merkmalswert sein sollte 0,5 2 = sein math.log(2+1, 8+1)

Ja, ich kann problemlos jeden beliebigen funktionsbasierten Transformator mit FunctionTransformer anwenden, aber ich möchte, dass die Basis des Protokolls (basierend auf) jeder Spalte (insbesondere der Maximalwert) ändert. Das heißt, ich möchte etwas wie die MaxAbsScaler tun, nur Logarithmen nehmen.

ich sehe, daß MaxAbsScaler bekommt zuerst ein Vektor (scale) der Maximalwerte von jeder Spalte (code) und dann ein Vielfaches der ursprünglichen Matrix mal 1/scale in code.

Allerdings weiß ich nicht, was zu tun ist, wenn ich die Logarithmen basierend auf dem Vektor scale nehmen möchte. Ist es sogar möglich, die Logarithmusoperation in eine Multiplikation (?) Zu transformieren, oder habe ich andere Möglichkeiten für effiziente Spary-Operationen?

Ich hoffe meine Absicht ist klar (und möglich).

Antwort

3

Der Logarithmus von x in der Basis b entspricht Log (x)/log (b), wobei die Logs natürlich sind. Der Prozess, den Sie beschreiben, besteht darin, zuerst log (x + 1) Transformation auf alles anzuwenden und dann mit dem absoluten Wert zu skalieren. Praktischerweise ist log (x + 1) eine eingebaute Funktion, log1p. Beispiel:

from sklearn.preprocessing import FunctionTransformer, maxabs_scale 
from scipy.sparse import csc_matrix 
import numpy as np 
logtran = FunctionTransformer(np.log1p, accept_sparse=True) 
X = csc_matrix([[ 1., 0, 8], [ 2., 0, 0], [ 0, 1., 2]]) 
Y = maxabs_scale(logtran.transform(X)) 

Ausgang (Sparse-Matrix Y):

(0, 0)  0.630929753571 
    (1, 0)  1.0 
    (2, 1)  1.0 
    (0, 2)  1.0 
    (2, 2)  0.5 
+0

Das ist gut denken! Genau was ich brauchte, danke! - Bei einer ähnlichen Anmerkung, ich denke mit _sparse_ Matrizen kann ich nicht zuerst auf einen minimalen Bereich reduzieren wie mit 'MinMaxScaler', das heißt, wenn die Feature-Spalte nur zwischen 40 und 80 liegt, ändere das Minimum auf 0 und 40 und dann , verwende "log1p" wie in deiner Antwort. - Ich würde das nur für ein paar Spalten tun müssen, ist es vielleicht effizient, nicht auf diesen Spalten zu arbeiten, nur dann zu tauschen? – juanmirocks

+0

Es ist eine seltsame Situation, wenn Sie eine spärliche Matrix haben, aber einige Spalten haben alle Werte von 40 bis 80. Ich hatte selbst nicht mit einer solchen Situation zu tun; Vielleicht möchten Sie eine separate Frage stellen, da sie sich von der obigen unterscheidet. – FTP

Verwandte Themen