Bu yazı temel bileşenler analizinin MATLAB ile kodlanması üzerinedir. Temel bileşenler analizi hakkında detaylı teorik bilgi için tıklayınız.

PCA, görüntü işleme de dahil olmak üzere birçok alanda sıkça kullanılan istatistiksel bir yöntemdir. Boyut azaltmak için başvurulabilir. Genel amaçlı bir MATLAB PCA kodu yazalım:

Girdiler

sampleMat ⇒ Her satırı bir örnek vektörden oluşan matris
n ⇒ (opsiyonel) istenilen özvektör ve özdeğer sayısı

Çıktılar

V ⇒ "sampleMat" ile verilen vektörlerin ana yönleri (özvektörleri). "V" matrisinin her sütunu bir özvektördür. Soldan sağa doğru baskınlık azalır.
D ⇒ "V" özvektörlerine ait özdeğerler. "D" vektörünün her elemanı, "V" matrisinin ilgili sütunundaki özvektör yönündeki değişintiyi (varyasyonu) gösterir.

Örnek

3 boyutta olan 5 nokta olsun. Bunları her satıra bir tanesi gelecek şekilde yazalım. x = [1 2 1; 0 2 1; 0 3 2; 2 4 1; 1 3 0], n = 2 olursa V iki sütundan oluşur ve ilk sütun en çok değişintinin oldugu yönü, ikinci sütun da sonraki baskın yonu gösterir. Bunlar birim vektörlerdir. İlk yöndeki değişinti 0.9576'dır. Standart sapma da bunun kareköküdür. Bu beş noktaya ait iki boyutun PCA sonuçları aşağıdaki gibidir.

V =

-0.7164 0.1720
-0.6486 -0.5212
0.2570 -0.8359

D =

0.9576
0.4412

Not: Eğer örnek sayısı, boyut sayısından azsa hızlı olması için Eckart-Young teoremini kullanır.

Kaynak Kod

% Temel/Ana Bilesenler Cozumlemesi/Analizi (Principle Component Analysis)
%
% Girdiler: sampleMat ⇒ Her satiri bir ornek vektorden olusan matris,
%           n ⇒ (opsiyonel) istenilen ozvektor ve ozdeger sayisi
% Ciktilar: V ⇒ "sampleMat" ile verilen vektorlerin ana yonleri (ozvektorleri).
%   "V" matrisinin her sutunu bir ozvektordur. Soldan saga dogru baskinlik azalir.
%           D ⇒ "V" ozvektorlerine ait ozdegerler. "D" vektorunun her elemani, "V"
%   matrisinin ilgili sutunundaki ozvektor yonundeki degisintiyi (varyasyonu) gosterir.
%
% Ornek: 3 boyutta olan 5 nokta olsun. Bunlari her satira bir tanesi gelecek sekilde yazalim.
% x = [1 2 1; 0 2 1; 0 3 2; 2 4 1; 1 3 0], n = 2 olursa V iki sutundan olusur ve ilk sutun
% en cok degisintinin oldugu yonu, ikinci sutun da sonraki
% baskin yonu gosterir.

% Not: Eger ornek sayisi, boyut sayisindan azsa hizli olmasi icin
% Eckart-Young teoremini kullanir.
%
% İsmail Arı, 2008

function [V,D] = pca(sampleMat,n)

nSamples = size(sampleMat,1);
nDim = size(sampleMat,2);

% Ortalama vektoru bul
meanSample = mean(sampleMat,1);

% sampleMat'taki tum elemanlardan ortalamayi cikararak normalizasyon yap
sampleMat = sampleMat - repmat(meanSample, nSamples, 1);

% Eger boyut sayisi ornek sayisindan coksa, hizli olmasi icin
% sampleMat'in transpozesini al
if nDim > nSamples
    sampleMat = sampleMat.';
end

% Dagilimin kovaryansini bul
C = sampleMat.' * sampleMat ./ nSamples;

% Ozdegerler (D) ve ozvektorleri (V) bul
% Hatirla ki: A*V = V*D ve V'nin her sutunu bir ozvektor
[V,D] = eig(C);
D = diag(D);

% Ozdegerleri buyukten kucuge siralamak gerekli. Matlab tersinden
% buldugu icin degerleri ters dondur.
D = flipud(D); % Sutun vektorunu altust et
V = fliplr(V); % Matrisin sagdan sola aynasini al

% Eger hizlandirma kullanildiysa Buldugumuz sutunlardan ozvektor bulup
% ozvektorleri normalize etmeliyiz. Ozdegerler aynidir. Bak: Eckart-Young Teoremi
if nDim > nSamples
    V = sampleMat * V;
    for i = 1:nSamples
        normV = norm(V(:,i));
        V(:,i) = V(:,i) ./ normV;
    end
end

if exist('n','var') % n verildiyse, ilk n degeri dondur
    if n > nDim
        error('Isdeginiz ozvektor sayisi bulduklarimdan fazla!')
    end
    D = D(1:n);
    V = V(:,1:n);
end