2010-12-28 10 views
16

Básicamente, toma una matriz y cámbiala para que su media sea igual a 0 y la varianza sea 1. Estoy usando las matrices numpy, así que si ya puede hacerlo es mejor, pero puedo implementarlo yo mismo siempre que pueda encuentra un algoritmo¿Cómo estandarizo una matriz?

edición: NVM nimrodm tiene una mejor aplicación

+1

Definir el "cambio". ¿Qué pasa si, digamos, simplemente reemplazamos la matriz con la matriz de identidad o algo así? ¿Qué tipos de transformaciones están bien? –

+0

Solo por curiosidad, ¿por qué necesitas hacer esto? –

+0

Estoy tratando de implementar un algoritmo de visión por computadora que solicite que esta operación se realice en los pasos intermedios. Creo que es porque es un requisito para PCA, pero no estoy seguro. – pnodbnda

Respuesta

0

tomar cada elemento y restar con la media y se divide por la desviación estándar.

Dispárame, no sé pitón. En general, la anterior es

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

Nota: esto funcionará, pero va a ser lento para matrices grandes. La respuesta de @nimrodm será mucho más rápida, ya que se beneficiará de las optimizaciones de Numpy. –

+2

Sí, usa 'Numpy'. Solo quería mostrar "en teoría" cómo normalizar. – ja72

47

El siguiente resta la media de una de cada elemento (la nueva media es 0), entonces se normaliza el resultado por la desviación estándar.

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

Lo anterior es para la normalización de toda la matriz en su conjunto, si A tiene muchas dimensiones y desea estandarizar cada columna individual, especificar el axis:

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

Siempre verifique con la mano lo que estos one-liners está haciendo antes de integrarlos en su código. Un simple cambio en la orientación o dimensión puede cambiar drásticamente (silenciosamente) las operaciones que numpy realiza en ellos.

+0

es posible que desee actualizar 'A' solo donde' std (A)> 0' para evitar la división por cero y los valores 'NaN' –

+0

¿Es esto posible que A se represente como una lista de listas? – Neamah

+0

@Neamah ¿Por qué no simplemente [convertir] (http://stackoverflow.com/questions/10346336/list-of-lists-into-numpy-array) a una matriz 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) 

Ejemplo:

>>> 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]]) 

funciona bien en grandes conjuntos de datos.

+0

puede usar ctrl + k para sangrar todo en lugar de barras invertidas. –

1

Use sklearn.preprocessing.scale.

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

Aquí se muestra un ejemplo.

>>> 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