MATLAB ile PCA (Temel Bileşenler Analizi)
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