2012-08-29 21 views
8

Ich habe eine große scipy.sparse.csc_matrix und möchte es normalisieren. Das subtrahiert den Spaltenmittelwert von jedem Element und dividiert durch die Spaltenstandardabweichung (std) i.Wie berechne ich die Varianz einer Spalte einer Sparse-Matrix in Scipy?

scipy.sparse.csc_matrix hat eine .mean() aber gibt es eine effiziente Möglichkeit, die Varianz oder Std zu berechnen?

+5

Ich wollte etwas Python-Code posten, um die Varianz vektorisiert zu berechnen, aber wenn Sie es "normalisieren", haben Sie keine Null-Elemente übrig, also sagen Sie uns bitte, dass Sie nichts vermasseln Ihre Sparsity-Struktur sowieso. – seberg

+0

Das ist ein sehr sehr guter Punkt Sebastian, danke. Daran habe ich nicht gedacht. – nickponline

Antwort

5

Sie können die Varianz sich mit dem Mittelwert berechnen, mit der folgenden formula:

E[X^2] - (E[X])^2 

E[X] steht für den Mittelwert. Um also E[X^2] zu berechnen, müssten Sie die csc_matrix quadrieren und dann die mean-Funktion verwenden. Um (E[X])^2 zu erhalten, müssen Sie einfach das Ergebnis der mean-Funktion quadrieren, die Sie mit dem normalen Eingang erhalten haben.

+2

Zur Vereinfachung der Matrix: 'c = matrix.copy(); c.data ** = 2' und dann 'c.mean (0); del c' (konnte nur '.data' ersetzen). Aber ich behaupte, dass das OP falsch klingt und von allen Elementen abzieht. – seberg

+0

Danke für die Antwort und Kommentare. – nickponline

3

Die effiziente Art und Weise tatsächlich ist die gesamte Matrix zu verdichten, standardisieren es dann in gewohnter Weise mit

X = X.toarray() 
X -= X.mean() 
X /= X.std() 

Wie @Sebastian in seinen Kommentaren darauf hingewiesen hat, Normierungs zerstört die sparsity Struktur (bringt viele nicht Nullelemente) im Subtraktionsschritt, so dass es nicht sinnvoll ist, die Matrix in einem spärlichen Format zu halten.

+0

Das stimmt nicht wirklich. Die Verwendung der Formel in der Antwort von Sicco ermöglicht die Verwendung von Sparsity zur Reduzierung der Rechenzeit. –

Verwandte Themen