Mengapa Andrew Ng lebih suka menggunakan SVD dan bukan EIG dari matriks kovarians untuk melakukan PCA?


29

Saya belajar PCA dari kursus Andrew Ng's Coursera dan materi lainnya. Dalam tugas pertama Stanford NLP kursus cs224n , dan dalam video ceramah dari Andrew Ng , mereka melakukan dekomposisi nilai singular bukan dekomposisi vektor eigen dari matriks kovarians, dan Ng bahkan mengatakan bahwa SVD secara numerik lebih stabil daripada komposisi eigend.

Dari pemahaman saya, untuk PCA kita harus melakukan SVD dari matriks (m,n)ukuran data , bukan dari matriks kovarians (n,n)ukuran. Dan dekomposisi vektor eigen dari matriks kovarians.

Mengapa mereka melakukan SVD matriks kovarians, bukan matriks data?


8
Untuk matriks semidefinit positif simetris persegi (seperti matriks kovarians), dekomposisi nilai eigen dan nilai singular sama persis.
Amoeba berkata Reinstate Monica

5
Maksud saya mereka secara matematis sama. Secara numerik mereka mungkin memang menggunakan algoritma yang berbeda dan satu mungkin lebih stabil daripada yang lain (seperti kata Ng). Ini menarik untuk diketahui lebih lanjut, +1.
Amuba kata Reinstate Monica

4
Beberapa informasi tentang ini di sini: de.mathworks.com/matlabcentral/newsreader/view_thread/21268 . Tetapi perhatikan bahwa setiap penjelasan tentang mengapa satu algoritma akan lebih stabil daripada yang lain akan menjadi sangat teknis.
Amuba kata Reinstate Monica

2
Di Matlab x=randn(10000); x=x'*x; tic; eig(x); toc; tic; svd(x); toc;pada mesin saya menghasilkan 12s untuk eig () dan 26s untuk svd (). Jika jauh lebih lambat, setidaknya harus lebih stabil! :-)
amoeba berkata Reinstate Monica

4
Yang mungkin didasarkan pada pemahaman yang salah: melakukan SVD dari matriks data yang adalah lebih stabil daripada menggunakan eigatau svdpada matriks kovarians, tapi sejauh yang saya tahu tidak ada perbedaan besar antara menggunakan eigatau svdpada matriks kovarians --- mereka keduanya algoritma stabil mundur. Jika ada, saya akan menempatkan uang saya pada eig menjadi lebih stabil, karena melakukan lebih sedikit perhitungan (dengan asumsi keduanya diimplementasikan dengan algoritma canggih).
Federico Poloni

Jawaban:


17

amuba sudah memberikan jawaban yang baik di komentar, tetapi jika Anda ingin argumen formal, ini dia.

Dekomposisi nilai singular dari matriks adalah , di mana kolom adalah vektor eigen dari dan entri diagonal adalah akar kuadrat dari nilai eigennya, yaitu .A = U Σ V T V A T A Σ σ i i = AA=UΣVTVATAΣσii=λi(ATA)

Seperti yang Anda ketahui, komponen utama adalah proyeksi ortogonal variabel Anda ke ruang vektor eigen dari matriks kovarians empiris . komponen diberikan oleh nilai eigennya, .λi(11n1ATAλi(1n1ATA)

Pertimbangkan matriks persegi , dan vektor sedemikian rupa sehingga . Kemudianα R v B v = λ vBαRvBv=λv

  1. Bkv=λkv
  2. λ(αB)=αλ(B)

Mari kita mendefinisikan . SVD akan menghitung komposisi eigend dari untuk menghasilkanSSTS=1S=1n1ATASSTS=1(n1)2ATAATA

  1. vektor eigen dari , yang menurut properti 1 adalah milikA T A(ATA)TATA=ATAATAATA
  2. yang akar kuadrat dari nilai eigen dari , yang oleh properti 2, kemudian 1, kemudian 2 lagi, adalah .1(n1)2ATAATA1(n1)2λi(ATAATA)=1(n1)2λi2(ATA)=1n1λi(ATA)=λi(1n1ATA)

Voa!

Mengenai stabilitas numerik, orang perlu mencari tahu apa alogritma yang digunakan. Jika Anda mau, saya percaya ini adalah rutinitas LAPACK yang digunakan oleh numpy:

Pembaruan: Pada stabilitas, implementasi SVD tampaknya menggunakan pendekatan divide-and-conquer, sedangkan komposisi eigend menggunakan algoritma QR polos. Saya tidak dapat mengakses beberapa makalah SIAM yang relevan dari institusi saya (menyalahkan pemotongan penelitian) tetapi saya menemukan sesuatu yang dapat mendukung penilaian bahwa rutin SVD lebih stabil.

Di

Nakatsukasa, Yuji, dan Nicholas J. Higham. "Algoritma spektral divide dan menaklukkan yang stabil dan efisien untuk dekomposisi nilai eigen simetris dan SVD." Jurnal SIAM tentang Scientific Computing 35.3 (2013): A1325-A1349.

mereka membandingkan stabilitas berbagai algoritma nilai eigen, dan tampaknya pendekatan divide-and-conquer (mereka menggunakan yang sama dengan numpy dalam salah satu eksperimen!) lebih stabil daripada algoritma QR. Ini, bersama dengan klaim di tempat lain bahwa metode D&C memang lebih stabil, mendukung pilihan Ng.


Nilai eigen yang saya peroleh dari svd pada kovarians dan svd pada data rata-rata terpusat tidak sama.
theGD

Namun, skornya, yaitu X * V (di mana V diperoleh dari [U, S, V] = svd (x) atau svd (covx)), sama.
theGD

1
@theGD Nilai eigen dari cov (X) dan nilai singular dari (X) tidak identik, lihat stats.stackexchange.com/questions/134282 .
Amuba kata Reinstate Monica

tidak perlu putus asa karena kurangnya akses ke jurnal SIAM: makalah yang Anda kutip ada di sini: opt.mist.iu-tokyo.ac.jp/~nakatsukasa/publishedpdf/pub13.pdf
Dima Pasechnik

2
@broncoAbierto teknologinya. laporan ada di sini: cpsc.yale.edu/sites/default/files/files/tr932.pdf (orang mungkin tidak dapat dengan mudah menemukannya karena salah ketik "Symetric" dalam judul di cpsc.yale.edu/research/technical-reports / 1992-technical-reports :-))
Dima Pasechnik

12

@amoeba memiliki jawaban yang sangat baik untuk pertanyaan PCA, termasuk yang ini tentang hubungan SVD ke PCA. Menjawab pertanyaan persis Anda, saya akan membuat tiga poin:

  • Secara matematis tidak ada perbedaan apakah Anda menghitung PCA pada matriks data secara langsung atau pada matriks kovariannya
  • perbedaannya murni karena presisi numerik dan kompleksitas. Menerapkan menerapkan SVD langsung ke matriks data secara numerik lebih stabil daripada ke matriks kovarians
  • SVD dapat diterapkan ke matriks kovarians untuk melakukan PCA atau mendapatkan nilai eigen, pada kenyataannya, ini adalah metode favorit saya untuk memecahkan masalah eigen

Ternyata SVD lebih stabil daripada prosedur dekomoposisi nilai eigen tipikal, terutama, untuk pembelajaran mesin. Dalam pembelajaran mesin, mudah untuk berakhir dengan regresi yang sangat kolinear. SVD bekerja lebih baik dalam kasus ini.

Berikut kode Python untuk menunjukkan maksudnya. Saya membuat matriks data yang sangat collinear, mendapatkan matriks kovariannya dan mencoba untuk mendapatkan nilai eigen dari yang terakhir. SVD masih berfungsi, sementara dekomposisi eigen biasa gagal dalam kasus ini.

import numpy as np
import math
from numpy import linalg as LA

np.random.seed(1)

# create the highly collinear series
T = 1000
X = np.random.rand(T,2)
eps = 1e-11
X[:,1] = X[:,0] + eps*X[:,1]

C = np.cov(np.transpose(X))
print('Cov: ',C)

U, s, V = LA.svd(C)
print('SVDs: ',s)

w, v = LA.eig(C)
print('eigen vals: ',w)

Keluaran:

Cov:  [[ 0.08311516  0.08311516]
 [ 0.08311516  0.08311516]]
SVDs:  [  1.66230312e-01   5.66687522e-18]
eigen vals:  [ 0.          0.16623031]

Memperbarui

Menjawab komentar Federico Poloni, inilah kode dengan pengujian stabilitas SVD vs Eig pada 1000 sampel acak dari matriks yang sama di atas. Dalam banyak kasus Eig menunjukkan 0 nilai eigen kecil, yang akan menyebabkan singularitas matriks, dan SVD tidak melakukannya di sini. SVD sekitar dua kali lebih tepat pada penentuan nilai eigen kecil, yang mungkin atau mungkin tidak penting tergantung pada masalah Anda.

import numpy as np
import math
from scipy.linalg import toeplitz
from numpy import linalg as LA

np.random.seed(1)

# create the highly collinear series
T = 100
p = 2
eps = 1e-8

m = 1000 # simulations
err = np.ones((m,2)) # accuracy of small eig value
for j in range(m):
    u = np.random.rand(T,p)
    X = np.ones(u.shape)
    X[:,0] = u[:,0]
    for i in range(1,p):
        X[:,i] = eps*u[:,i]+u[:,0]

    C = np.cov(np.transpose(X))

    U, s, V = LA.svd(C)

    w, v = LA.eig(C)

    # true eigen values
    te = eps**2/2 * np.var(u[:,1])*(1-np.corrcoef(u,rowvar=False)[0,1]**2)
    err[j,0] = s[p-1] - te
    err[j,1] = np.amin(w) - te


print('Cov: ',C)
print('SVDs: ',s)
print('eigen vals: ',w)
print('true small eigenvals: ',te)

acc = np.mean(np.abs(err),axis=0)    
print("small eigenval, accuracy SVD, Eig: ",acc[0]/te,acc[1]/te)

Keluaran:

Cov:  [[ 0.09189421  0.09189421]
 [ 0.09189421  0.09189421]]
SVDs:  [ 0.18378843  0.        ]
eigen vals:  [  1.38777878e-17   1.83788428e-01]
true small eigenvals:  4.02633695086e-18
small eigenval, accuracy SVD, Eig:  2.43114702041 3.31970128319

x1=ux2=u+εv
u,v
(σ12σ12+ερσ1σ2σ12+ερσ1σ2σ12+2ερσ1σ2+ε2σ22σ2)
σ12,σ22,ρ

λ=12(σ22ε2σ24ε4+4σ23ρσ1ε3+8σ22ρ2σ12ε2+8σ2ρσ13ε+4σ14+2σ2ρσ1ε+2σ12)
ε
λσ22ε2(1ρ2)/2

j=1,,mλ^jej=λλ^j


4
Ya, tapi di sini OP bertanya tentang SVD vs EIG yang diterapkan baik pada matriks kovarians.
Amuba mengatakan Reinstate Monica

1
@amoeba, saya mengklarifikasi hubungan SVD dan PCA
Aksakal

Ini jawaban yang bagus. Saya berharap, untuk menyebutkan, bahwa svd tidak dapat mendeteksi nilai eigen negatif ketika ada dan Anda ingin melihatnya (jika matriks kovarians tidak asli tetapi, katakanlah, dihaluskan atau diperkirakan entah bagaimana atau disimpulkan atau keluar dari penghapusan berpasangan) dari nilai yang hilang). Selain itu, eig pada matriks cov tetap sedikit lebih cepat daripada svd di atasnya.
ttnphns

@ttnphns, matriks pasti non-positif adalah masalah, tentu saja
Aksakal

1
@FedericoPoloni, pada aritmatika FP dan tidak tahu jawaban yang tepat saya tidak setuju. Dalam hal ini saya tahu jawabannya dengan cukup presisi untuk tugas ini. Pada 2x2 Anda memiliki poin yang adil. Saya akan memikirkan sesuatu.
Aksakal

6

Untuk pengguna Python, saya ingin menunjukkan bahwa untuk matriks simetris (seperti matriks kovarians), lebih baik menggunakan numpy.linalg.eighfungsi daripada numpy.linalg.eigfungsi umum .

eigh9-10 kali lebih cepat daripada eigdi komputer saya (terlepas dari ukuran matriks) dan memiliki akurasi yang lebih baik (berdasarkan uji akurasi @ Aksakal).

Saya tidak yakin dengan demonstrasi manfaat akurasi SVD dengan nilai eigen kecil. Tes @ Aksakal adalah 1-2 urutan besarnya lebih sensitif terhadap keadaan acak daripada algoritma (cobalah merencanakan semua kesalahan alih-alih menguranginya menjadi satu maksimum absolut). Ini berarti bahwa kesalahan kecil dalam matriks kovarians akan memiliki efek yang lebih besar pada akurasi daripada pemilihan algoritma komposisi eigendec. Juga, ini tidak terkait dengan pertanyaan utama, yaitu tentang PCA. Komponen terkecil diabaikan dalam PCA.

Argumen serupa dapat dibuat tentang stabilitas numerik. Jika saya harus menggunakan metode matriks kovarians untuk PCA, saya akan menguraikannya dengan eighbukan svd. Jika gagal (yang belum didemonstrasikan di sini), maka mungkin Anda perlu memikirkan kembali masalah yang Anda coba selesaikan sebelum mulai mencari algoritma yang lebih baik.



2

mnmn

Menghitung matriks kovarians dan kemudian melakukan SVD pada yang jauh lebih cepat daripada menghitung SVD pada matriks data lengkap dalam kondisi ini, untuk hasil yang sama.

Bahkan untuk nilai yang cukup kecil, peningkatan kinerja adalah faktor ribuan (milidetik vs detik). Saya menjalankan beberapa tes pada mesin saya untuk membandingkan menggunakan Matlab: masukkan deskripsi gambar di sini

Itu hanya waktu CPU, tetapi kebutuhan penyimpanan sama pentingnya, jika tidak lebih penting. Jika Anda mencoba SVD pada sejuta demi seribu matriks di Matlab, ia akan melakukan kesalahan secara default, karena membutuhkan ukuran larik yang berfungsi yaitu 7.4TB.


Ini tidak menjawab pertanyaan yaitu tentang EIG dari matriks cov vs SVD dari matriks kovarians .
Amoeba berkata Reinstate Monica

1
Pertanyaannya di bagian akhir, yang disoroti dengan tebal, menyatakan, "Mengapa mereka melakukan SVD dari matriks kovarian, bukan matriks data?" yang saya jawab.
Gruff

Saya akan mengedit kalimat pembuka untuk menjelaskan bahwa saya menjawab bagian dari pertanyaan OP. Saya melihat bagaimana itu bisa membingungkan. Terima kasih.
Gruff

Jika Anda mencoba SVD pada sejuta demi seribu matriks di Matlab, ia akan salah secara default. Praktek numerik yang baik adalah menggunakan SVD yang tipis, dalam kasus ini. Ini akan sangat meningkatkan ukuran dan kinerja penyimpanan.
Federico Poloni
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.