Analyse des composantes principales dans Matlab
-
25-09-2019 - |
Question
Je mise en œuvre PCA en utilisant la décomposition des données rares valeurs propres. Je sais que Matlab a PCA mis en œuvre, mais il me aide à comprendre tous les aspects techniques quand j'écrire du code. J'ai suivi les conseils de ici , mais je reçois des résultats différents par rapport à la fonction intégrée princomp.
Quelqu'un pourrait regarder et me diriger dans la bonne direction.
Voici le code:
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);
La solution
Voici comment je le ferais:
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
et un exemple pour la comparer à la fonction PRINCOMP de la Boîte à outils Statistiques:
load fisheriris
[V newX D] = myPCA(meas);
[PC newData Var] = princomp(meas);
Vous pourriez également être intéressé par ce poste lié au sujet de l'exécution PCA par SVD .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow