2010-12-09 18 views
7

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); 

Antwort

10

Hier ist, wie ich es tun würde:

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 

und ein Beispiel gegen die princomp Funktion aus der Statistics Toolbox zum Vergleich:

load fisheriris 

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

Sie könnten auch Interesse an diesem verwandten Beitrag über die Durchführung PCA by SVD.

+0

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'? –

+0

Ich möchte' coeff' und 'latent' verwenden, wobei' coeff' mit 'latents' sortiert ist. Darf ich die eingebaute Funktion 'princomp' oder Ihre' myPCA' verwenden? –

+0

@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