2012-08-29 12 views
8

Mam duży scipy.sparse.csc_matrix i chciałbym go znormalizować. Oznacza to odjęcie średniej kolumny od każdego elementu i podzielenie przez odchylenie standardowe standardowe (std) i.Jak obliczyć wariancję kolumny rzadkiej macierzy w Scipy?

scipy.sparse.csc_matrix ma .mean(), ale czy istnieje skuteczny sposób obliczenia wariancji lub std?

+5

Zamierzałem zamieścić trochę kodu Pythona, aby obliczyć wariancję w wektoryzacji, ale jeśli "znormalizujesz", nie będziesz miał już żadnych zerowych elementów, więc zanim to zrobię, powiedz nam, że nie robisz bałaganu twoja struktura spearsity i tak. – seberg

+0

To bardzo dobry punkt, Sebastian, dziękuję. Nie myślałem o tym. – nickponline

Odpowiedz

5

Można obliczyć wariancję samemu stosując średnią, z następującym formula:

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

E[X] Stojaki do średniej. Aby obliczyć wartość E[X^2], musisz wyrównać wartość csc_matrix, a następnie użyć funkcji mean. Aby uzyskać (E[X])^2, wystarczy wyrównać wynik funkcji mean uzyskanej przy użyciu normalnego wejścia.

+2

Aby wyrównać macierz, dla uproszczenia: 'c = matrix.copy(); c.data ** = 2', a następnie 'c.mean (0); del c' (mógł tylko zastąpić '.data'). Ale utrzymuję, że PO brzmi źle mówiąc, aby odjąć od wszystkich elementów. – seberg

+0

Dzięki za odpowiedź i komentarze. – nickponline

3

Sprawne sposobem jest faktycznie do zagęszczenia całą matrycę, a następnie ujednolicić ją w zwykły sposób z

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

Jak @Sebastian odnotował w swoich komentarzach, normalizująca niszczy strukturę sparsity (wprowadza wiele nie- zero elementów) w kroku odejmowania, więc nie ma sensu utrzymywanie macierzy w rzadkim formacie.

+0

To nie jest prawda. Zastosowanie formuły w odpowiedzi Sicco pozwala wykorzystać rzadkość w celu skrócenia czasu obliczeń. –

Powiązane problemy