Bagaimana cara membalikkan PCA dan merekonstruksi variabel asli dari beberapa komponen utama?

113

Analisis komponen utama (PCA) dapat digunakan untuk pengurangan dimensi. Setelah pengurangan dimensi seperti itu dilakukan, bagaimana kira-kira orang dapat merekonstruksi variabel / fitur asli dari sejumlah kecil komponen utama?

Atau, bagaimana seseorang dapat menghapus atau membuang beberapa komponen utama dari data?

Dengan kata lain, bagaimana cara membalikkan PCA?


Mengingat bahwa PCA terkait erat dengan dekomposisi nilai singular (SVD), pertanyaan yang sama dapat ditanyakan sebagai berikut: bagaimana cara membalikkan SVD?

amuba
sumber
10
Saya memposting utas T&J ini, karena saya lelah melihat lusinan pertanyaan yang menanyakan hal ini dan tidak dapat menutupnya sebagai duplikat karena kami tidak memiliki utas kanonik tentang topik ini. Ada beberapa utas yang serupa dengan jawaban yang layak tetapi semua tampaknya memiliki keterbatasan serius, seperti misalnya berfokus secara khusus pada R.
amoeba
4
Saya menghargai upaya ini - saya pikir ada kebutuhan yang sangat besar untuk mengumpulkan informasi tentang PCA, apa yang dilakukannya, apa yang tidak dilakukannya, menjadi satu atau beberapa utas berkualitas tinggi. Saya senang Anda melakukannya untuk diri sendiri!
Sycorax
1
Saya tidak yakin bahwa jawaban kanonik "pembersihan" ini sesuai dengan tujuannya. Apa yang kita miliki di sini adalah pertanyaan dan jawaban yang sangat bagus dan umum , tetapi masing-masing pertanyaan memiliki beberapa seluk beluk tentang PCA dalam praktik yang hilang di sini. Pada dasarnya Anda telah mengambil semua pertanyaan, melakukan PCA pada mereka, dan membuang komponen utama yang lebih rendah, di mana kadang-kadang, detail yang kaya dan penting disembunyikan. Selain itu, Anda telah kembali ke notasi Linear Aljabar buku teks yang justru membuat PCA buram bagi banyak orang, alih-alih menggunakan lingua franca ahli statistik biasa, yaitu R.
Thomas Browne
1
@ Thomas, terima kasih. Saya pikir kami memiliki perselisihan, senang mendiskusikannya dalam obrolan atau dalam Meta. Sangat singkat: (1) Mungkin memang lebih baik untuk menjawab setiap pertanyaan secara individual, tetapi kenyataan pahit adalah bahwa hal itu tidak terjadi. Banyak pertanyaan yang tidak terjawab, seperti pertanyaan Anda. (2) Komunitas di sini sangat menyukai jawaban generik yang bermanfaat bagi banyak orang; Anda dapat melihat jawaban seperti apa yang paling banyak dipilih. (3) Setuju tentang matematika, tapi itu sebabnya saya memberikan kode R di sini! (4) Tidak setuju tentang lingua franca; secara pribadi, saya tidak tahu R.
amoeba
@amoeba Saya khawatir saya tidak tahu bagaimana menemukan kata obrolan karena saya belum pernah berpartisipasi dalam diskusi meta sebelumnya.
Thomas Browne

Jawaban:

147

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:

masukkan deskripsi gambar di sini

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:pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+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.XVVpVV

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

Dua versi abu-abu dari gambar Lenna.  Yang di sebelah kanan berbintik tetapi jelas-jelas bisa dikenali.

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=USVkzUkpS1: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  
amuba
sumber
1
Dalam MATLAB Anda dapat mengambil mu dari output PCA standar, dan juga dapat menyediakan jumlah komponen dalam input.
Aksakal
2
@Aksakal Saya mencoba membuat ketiga kutipan kode yang sama (dan sejelas) mungkin; khususnya, saya ingin menghitung dengan tangan sebelum memanggil pca (), dan juga menjalankan PCA dengan semua komponen dan hanya menggunakan komponen ketika melakukan dot produk antara skor dan vektor eigen. Saya sekarang telah memodifikasi kode Python untuk mengikuti pola yang sama. μnComp
amoeba
3
Saya akan menghapus semuanya dari jawaban yang tidak terkait dengan jawaban langsung untuk pertanyaan, seperti gambar gadis manis dan pemrosesan gambar. Jika seseorang tidak tertarik pada gambar itu membuat konsumsi sulit. Ingatlah bahwa siapa pun yang mengajukan pertanyaan sudah sangat bingung.
Aksakal
5
Lenna adalah sebagai standar data yang ditetapkan sebagai iris.
StasK
2
@amoeba saya berbicara tentang ukuran, kedalaman bit, bahkan piksel hitam di perbatasan. Saya belum memiliki versi definitif http://www.ece.rice.edu/~wakin/images/ : "Sepertinya ada banyak versi gambar uji Lena (alias" Lenna ") tersedia. Masalah ini dicatat oleh Shapiro dalam makalah zerotree 1993, dan itu tetap benar sampai hari ini "
Laurent Duval