PCA menghitung vektor eigen dari matriks kovarians ("sumbu utama") dan mengurutkannya berdasarkan nilai eigennya (jumlah varian yang dijelaskan). Data terpusat kemudian dapat diproyeksikan ke sumbu utama ini untuk menghasilkan komponen utama ("skor"). Untuk keperluan pengurangan dimensionalitas, seseorang hanya dapat menyimpan sebagian komponen utama dan membuang sisanya. (Lihat di sini untuk pengantar awam tentang PCA .)
Xrawn×pnpμXVp×kkkn×kZ=XV
Ini diilustrasikan pada gambar di bawah ini: subplot pertama menunjukkan beberapa data terpusat (data yang sama yang saya gunakan dalam animasi saya di utas tertaut) dan proyeksi pada sumbu utama pertama. Anak petak kedua hanya menunjukkan nilai-nilai dari proyeksi ini; dimensi telah dikurangi dari dua menjadi satu:
Untuk dapat merekonstruksi dua variabel asli dari komponen utama yang satu ini, kita dapat memetakannya kembali ke dimensi dengan . Memang, nilai masing-masing PC harus ditempatkan pada vektor yang sama seperti yang digunakan untuk proyeksi; bandingkan subplot 1 dan 3. Hasilnya kemudian diberikan oleh . Saya menampilkannya di subplot ketiga di atas. Untuk mendapatkan rekonstruksi akhir , kita perlu menambahkan vektor rata-rata untuk itu:pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
Perhatikan bahwa seseorang dapat langsung dari subplot pertama ke subplot ketiga dengan mengalikan dengan matriks ; ini disebut matriks proyeksi . Jika semua vektor eigen yang digunakan, maka adalah matriks identitas (tidak ada pengurangan dimensi dilakukan, maka "rekonstruksi" sempurna). Jika hanya sebagian dari vektor eigen yang digunakan, itu bukan identitas.XVV⊤pVV⊤
Ini berfungsi untuk titik arbitrer di ruang PC; itu dapat dipetakan ke ruang asli melalui .zx^=zV⊤
Membuang (menghapus) PC terkemuka
Kadang-kadang seseorang ingin membuang (untuk menghapus) satu atau beberapa PC terkemuka dan menyimpan sisanya, alih-alih menjaga PC terkemuka dan membuang sisanya (seperti di atas). Dalam hal ini semua rumus tetap sama persis , tetapi harus terdiri dari semua sumbu utama kecuali untuk yang ingin dibuang. Dengan kata lain, harus selalu menyertakan semua PC yang ingin disimpan.VV
Peringatan tentang PCA pada korelasi
Ketika PCA dilakukan pada matriks korelasi (dan bukan pada matriks kovarians), data mentah tidak hanya dipusatkan dengan mengurangi tetapi juga diskalakan dengan membagi setiap kolom dengan standar deviasi . Dalam hal ini, untuk merekonstruksi data asli, kita perlu menskala ulang kolom dengan dan hanya kemudian menambahkan kembali vektor rata-rata . μ σ i X σ i μXrawμσiX^σiμ
Contoh pengolahan gambar
Topik ini sering muncul dalam konteks pemrosesan gambar. Pertimbangkan Lenna - salah satu gambar standar dalam literatur pemrosesan gambar (ikuti tautan untuk menemukan dari mana asalnya). Di bawah di sebelah kiri, saya menampilkan varian skala abu-abu dari gambar (file tersedia di sini ).512×512
Kita dapat memperlakukan gambar skala abu-abu ini sebagai data matrix . Saya melakukan PCA di atasnya dan menghitung menggunakan 50 komponen utama pertama. Hasilnya ditampilkan di sebelah kanan.X baku X baku512×512XrawX^raw
Mengembalikan SVD
PCA sangat terkait erat dengan dekomposisi nilai singular (SVD), lihat
Hubungan antara SVD dan PCA. Bagaimana cara menggunakan SVD untuk melakukan PCA? untuk lebih jelasnya. Jika matriks adalah SVD-ed sebagai dan seseorang memilih vektor -dimensi yang mewakili titik dalam ruang "berkurang" dari dimensi , maka untuk memetakannya kembali ke dimensi kita perlu melipatgandakannya dengan .X X = U S V ⊤ k z U k p S ⊤ 1 : k , 1 : k V ⊤ : , 1 : kn×pXX=USV⊤kzUkpS⊤1:k,1:kV⊤:,1:k
Contoh dalam R, Matlab, Python, dan Stata
Saya akan melakukan PCA pada data Fisher Iris dan kemudian merekonstruksinya menggunakan dua komponen utama pertama. Saya melakukan PCA pada matriks kovarians, bukan pada matriks korelasi, yaitu saya tidak menskalakan variabel di sini. Tapi saya masih harus menambahkan mean kembali. Beberapa paket, seperti Stata, menanganinya melalui sintaks standar. Terima kasih kepada @StasK dan @Kodiologist untuk bantuan mereka dengan kode.
Kami akan memeriksa rekonstruksi titik data pertama, yaitu:
5.1 3.5 1.4 0.2
Matlab
load fisheriris
X = meas;
mu = mean(X);
[eigenvectors, scores] = pca(X);
nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);
Xhat(1,:)
Keluaran:
5.083 3.5174 1.4032 0.21353
R
X = iris[,1:4]
mu = colMeans(X)
Xpca = prcomp(X)
nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)
Xhat[1,]
Keluaran:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0830390 3.5174139 1.4032137 0.2135317
Untuk mengerjakan R contoh rekonstruksi PCA gambar lihat juga jawaban ini .
Python
import numpy as np
import sklearn.datasets, sklearn.decomposition
X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)
pca = sklearn.decomposition.PCA()
pca.fit(X)
nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu
print(Xhat[0,])
Keluaran:
[ 5.08718247 3.51315614 1.4020428 0.21105556]
Perhatikan bahwa ini sedikit berbeda dari hasil dalam bahasa lain. Itu karena versi dataset Iris dari Python mengandung kesalahan .
Stata
webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1
iris seplen sepwid petlen petwid _seplen _sepwid _petlen _petwid
setosa 5.1 3.5 1.4 0.2 5.083039 3.517414 1.403214 .2135317