2010-12-09 25 views
7

Estoy implementando PCA utilizando la descomposición de valores propios para datos dispersos. Sé que MATLAB ha implementado PCA, pero me ayuda a comprender todos los aspectos técnicos cuando escribo el código. He estado siguiendo las instrucciones del here, pero obtengo resultados diferentes en comparación con la función incorporada de princomp.Análisis de componentes principales en MATLAB

¿Alguien podría mirarlo y apuntarme en la dirección correcta?

Aquí está el código:

function [mu, Ev, Val ] = pca(data) 

% mu - mean image 
% Ev - matrix whose columns are the eigenvectors corresponding to the eigen 
% values Val 
% Val - eigenvalues 

if nargin ~= 1 
error ('usage: [mu,E,Values] = pca_q1(data)'); 
end 

mu = mean(data)'; 

nimages = size(data,2); 

for i = 1:nimages 
data(:,i) = data(:,i)-mu(i); 
end 

L = data'*data; 
[Ev, Vals] = eig(L);  
[Ev,Vals] = sort(Ev,Vals); 

% computing eigenvector of the real covariance matrix 
Ev = data * Ev; 

Val = diag(Vals); 
Vals = Vals/(nimages - 1); 

% normalize Ev to unit length 
proper = 0; 
for i = 1:nimages 
Ev(:,i) = Ev(:,1)/norm(Ev(:,i)); 
if Vals(i) < 0.00001 
    Ev(:,i) = zeros(size(Ev,1),1); 
else 
    proper = proper+1; 
end; 
end; 

Ev = Ev(:,1:nimages); 

Respuesta

10

Así es como yo lo haría:

function [V newX D] = myPCA(X) 
    X = bsxfun(@minus, X, mean(X,1));   %# zero-center 
    C = (X'*X)./(size(X,1)-1);     %'# cov(X) 

    [V D] = eig(C); 
    [D order] = sort(diag(D), 'descend');  %# sort cols high to low 
    V = V(:,order); 

    newX = X*V(:,1:end); 
end 

y un ejemplo con el que comparar la función PRINCOMP de la Caja de Herramientas Estadísticas:

load fisheriris 

[V newX D] = myPCA(meas); 
[PC newData Var] = princomp(meas); 

También podría estar interesado en esta publicación relacionada sobre la realización de PCA by SVD.

+0

Quiero preguntar algo, ¿'princomp' ordena los datos de' COEFF' por 'latente' de forma predeterminada (ref: http://www.mathworks.com/help/stats/princomp.html)? Cuál es la diferencia entre su función y 'princomp' –

+0

Quiero usar' coeff' y 'latente' donde' coeff' está clasificado con 'latents'. ¿Puedo usar la función incorporada 'princomp' o tu' myPCA'? –

+0

@AhsanAli: obviamente como muestra el ejemplo anterior, ambas funciones producen la misma salida (hasta una cierta precisión); las columnas de 'COEFF' (componentes principales) se ordenan en orden descendente en términos de varianza de componentes' LATENT'. También verifique el último enlace mencionado anteriormente sobre la realización de PCA utilizando SVD en lugar de EIG. Tenga en cuenta que ['princomp'] (http://www.mathworks.com/help/stats/princomp.html) está siendo reemplazado por [' pca '] (http://www.mathworks.com/help/stats/pca.html) funcionan en ediciones recientes (de hecho, verifican el código fuente para ver que las llamadas a' princomp' se enrutan a 'pca' internamente). – Amro

Cuestiones relacionadas