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);
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' –
Quiero usar' coeff' y 'latente' donde' coeff' está clasificado con 'latents'. ¿Puedo usar la función incorporada 'princomp' o tu' myPCA'? –
@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