2010-12-28 10 views
16

Zasadniczo, weź matrycę i zmień ją tak, aby jej średnia była równa 0, a wariancja 1. Używam tablic numpy, więc jeśli już to potrafi, to jest lepiej, ale mogę ją wdrożyć tak długo, jak mogę znajdź algorytm.Jak mogę ujednolicić matrycę?

edit: nvm nimrodm ma lepszą realizację

+1

Zdefiniuj "zmiana". Co jeśli, powiedzmy, po prostu zastąpimy macierz macierzą tożsamości lub coś takiego? Jakie rodzaje transformacji są w porządku? –

+0

Po prostu z ciekawości, dlaczego musisz to zrobić? –

+0

Próbuję zaimplementować algorytm wizji komputerowej, który prosi o wykonanie tej operacji w pośrednich krokach. Myślę, że to dlatego, że jest to wymaganie dla PCA, ale nie jestem pewien. – pnodbnda

Odpowiedz

0

wziąć każdy element i odejmować ze średniej, a następnie podzielić przez odchylenie standardowe.

Zastrzel mnie, nie znam Pythona. Na ogół powyżej

mu = Average() 
sig = StandardDeviation() 
for(i=0;i<rows;i++) 
{ 
    for(j=0;j<cols;j++) 
    { 
     A[i,j] = (A[i,j]-mu)/sig; 
    } 
} 
+4

Uwaga: to zadziała, ale będzie działać wolno w przypadku dużych macierzy. Odpowiedź @ nimrodma będzie znacznie szybsza, ponieważ skorzysta z optymalizacji numpy. –

+2

Tak, użyj 'Numpy'. Chciałem tylko pokazać "w teorii" jak normalizować. – ja72

47

następuje odejmuje średnią dla każdego z elementów (nowej średnia wynosi 0), po czym wynik normalizuje się przez odchylenie standardowe.

from numpy import * 
A = (A - mean(A))/std(A) 

Powyższe jest do standaryzacji całą macierz jako całość, jeśli ma wiele wymiarów i chcesz standaryzować każdą kolumnę indywidualnie określić axis:

from numpy import * 
A = (A - mean(A, axis=0))/std(A, axis=0) 

Zawsze należy sprawdzić ręcznie, co to One-wkładki robią przed integracją ich w swoim kodzie. Prosta zmiana orientacji lub wymiaru może drastycznie zmienić (cicho), jakie operacje wykonuje na nich numpy.

+0

możesz chcieć zaktualizować 'A' tylko tam, gdzie' std (A)> 0', aby uniknąć dzielenia przez zero i 'NaN' wartości –

+0

Czy jest to możliwe, gdy A jest reprezentowane jako lista list? – Neamah

+0

@Neamah Dlaczego nie tylko [konwersja] (http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) na tablicę numpy? – kingledion

6
import scipy.stats as ss 

A = np.array(ss.zscore(A)) 
3
from sklearn.preprocessing import StandardScaler 

standardized_data = StandardScaler().fit_transform(your_data) 

przykład:

>>> import numpy as np 
>>> from sklearn.preprocessing import StandardScaler 

>>> data = np.random.randint(25, size=(4, 4)) 
>>> data 
array([[17, 12, 4, 17], 
     [ 1, 16, 19, 1], 
     [ 7, 8, 10, 4], 
     [22, 4, 2, 8]]) 

>>> standardized_data = StandardScaler().fit_transform(data) 
>>> standardized_data 
array([[ 0.63812398, 0.4472136 , -0.718646 , 1.57786412], 
     [-1.30663482, 1.34164079, 1.55076242, -1.07959124], 
     [-0.57735027, -0.4472136 , 0.18911737, -0.58131836], 
     [ 1.24586111, -1.34164079, -1.02123379, 0.08304548]]) 

Sprawdza się również przy dużych zbiorów danych.

+0

możesz użyć ctrl + k do wcięcia wszystkiego zamiast zwrotów. –

1

Użyj sklearn.preprocessing.scale.

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html

Oto przykład.

>>> from sklearn import preprocessing 
>>> import numpy as np 
>>> X_train = np.array([[ 1., -1., 2.], 
...      [ 2., 0., 0.], 
...      [ 0., 1., -1.]]) 
>>> X_scaled = preprocessing.scale(X_train) 
>>> X_scaled 
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

Powiązane problemy