Ich implementiere PCA mit Eigenwertzerlegung für spärliche Daten. Ich weiß, dass Matlab PCA implementiert hat, aber es hilft mir, alle technischen Details zu verstehen, wenn ich Code schreibe. Ich habe die Anleitung von here folgen, aber ich bekomme andere Ergebnisse im Vergleich zu integrierten Funktion princomp.Hauptkomponentenanalyse in MATLAB
Könnte irgendjemand es betrachten und mir in die richtige Richtung zeigen.
Hier ist der 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);
Ich möchte etwas fragen, Is 'princomp' sortiert die Daten von' COEFF' standardmäßig nach 'latent' (ref: http://www.mathworks.com/help/stats/princomp.html)? Was ist der Unterschied zwischen Ihrer Funktion und 'princomp'? –
Ich möchte' coeff' und 'latent' verwenden, wobei' coeff' mit 'latents' sortiert ist. Darf ich die eingebaute Funktion 'princomp' oder Ihre' myPCA' verwenden? –
@AhsanAli: Wie das obige Beispiel zeigt, erzeugen beide Funktionen dieselbe Ausgabe (bis zu einer gewissen Genauigkeit); die Spalten von 'COEFF' (Hauptkomponenten) sind in absteigender Reihenfolge nach der Komponentenvarianz' LATENT' sortiert. Überprüfen Sie auch den letzten oben erwähnten Link zum Ausführen von PCA mit SVD anstelle von EIG. Beachten Sie, dass ['princomp'] (http://www.mathworks.com/help/stats/princomp.html) durch [' pca ersetzt wird '] (http://www.mathworks.com/help/stats/pca.html) Funktion in den letzten Editionen (in der Tat überprüfen Sie den Quellcode, um zu sehen, dass Aufrufe von' princomp' intern zu 'pca' geroutet werden). – Amro