Debe normalizar los datos antes de hacer PCA. Por ejemplo, considere la siguiente situación. Puedo crear un conjunto de datos X
con una matriz de correlación conocida C
:
>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
Si ahora realizo PCA, I correctamente encontramos que los componentes principales (las filas del vector pesos) están orientados en un ángulo con los ejes de coordenadas :
>> wts=pca(X)
wts =
0.6659 0.7461
-0.7461 0.6659
Si ahora escalar la primera película de la serie de datos en un 100, intuitivamente pensamos que los principales componentes no deben cambiar:
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
Sin embargo, ahora encontramos que los componentes principales están alineados con los ejes de coordenadas:
>> wts=pca(Y)
wts =
1.0000 0.0056
-0.0056 1.0000
Para resolver esto, hay dos opciones. En primer lugar, podría cambiar la escala de los datos:
>> Ynorm = bsxfun(@rdivide,Y,std(Y))
(La notación extraña bsxfun
se utiliza para hacer la aritmética matricial en Matlab - todo lo que estoy haciendo está restando la media y dividiendo por la desviación estándar de cada función) .
Ahora obtenemos resultados sensibles de PCA:
>> wts = pca(Ynorm)
wts =
-0.7125 -0.7016
0.7016 -0.7125
Son ligeramente diferente a la PCA en los datos originales, porque ahora hemos garantizado que nuestras características tienen unidad de desviación estándar, lo cual no era el caso originalmente.
La otra opción es llevar a cabo PCA utilizando la matriz de correlación de los datos, en lugar del producto exterior:
>> wts = pca(Y,'corr')
wts =
0.7071 0.7071
-0.7071 0.7071
De hecho esto es completamente equivalente a la normalización de la fecha restando la media y dividiendo por la desviación estándar. Es más conveniente. En mi opinión, debe siempre hacer esto a menos que tenga una buena razón para no hacerlo (por ejemplo, si desea para detectar diferencias en la variación de cada función).