Mengapa saya tidak bisa mendapatkan SVD X yang valid melalui dekomposisi nilai eigen dari XX 'dan X'X?

9

Saya mencoba melakukan SVD dengan tangan:

m<-matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U=eigen(m%*%t(m))$vector
V=eigen(t(m)%*%m)$vector
D=sqrt(diag(eigen(m%*%t(m))$values))

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d)

U1%*%D1%*%t(V1)
U%*%D%*%t(V)

Tetapi baris terakhir tidak mkembali. Mengapa? Tampaknya ada hubungannya dengan tanda-tanda vektor eigen ini ... Atau apakah saya salah memahami prosedur?

ahli statistik yang gagal
sumber
Saya berulang kali diberitahu bahwa tanda itu tidak penting di SVD ... seperti ini
failstatistician
@Amoeba Terima kasih telah menjelaskannya. Saya berfokus pada pertanyaan bahasa Inggris daripada kode. Ahli statistik gagal: lihat apa yang D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))dilakukan dan ingat bahwa akar kuadrat (dan juga vektor eigen yang dinormalisasi) hanya ditentukan hingga tanda. Untuk wawasan lebih lanjut, perubahan mke m <- matrix(-2,1,1)dan termasuk ,1,1)pada akhir masing-masing panggilan ke diag. Ini adalah contoh yang menciptakan masalah yang sama - tetapi sangat sederhana sifat masalah akan menjadi sangat jelas. 1×1
whuber
1
Oke. Terima kasih! Apakah Anda memiliki aturan umum untuk menentukan vektor c (-1, 1, 1)? Atau bagaimana tanda-tanda kedua dekomposisi itu harus dihubungkan?
Gagal statistik
1
Perhatikan bahwa trik @ whuber dengan c(-1,1,1)berhasil, tetapi Ddidefinisikan seperti itu tidak memberi Anda nilai tunggal. Nilai singular semua harus positif menurut definisi. Pertanyaan tentang bagaimana menghubungkan tanda-tanda Udan Vbaik, dan saya tidak punya jawaban. Mengapa Anda tidak melakukan SVD saja? :-)
amoeba

Jawaban:

13

Analisis Masalah

SVD suatu matriks tidak pernah unik. Biarkan matriks memiliki dimensi dan biarkan SVD-nyan × kAn×k

A=UDV

untuk matriks dengan kolom ortonormal, diagonal matriks dengan entri non-negatif, dan matriks dengan kolom ortonormal.U p × p D k × p Vn×pUp×pDk×pV

Sekarang pilih, secara sewenang-wenang , setiap diagonal matriks memiliki s di diagonal, sehingga adalah identity . KemudianS ± 1 S 2 = I p × p I pp×pS±1S2=Ip×pIp

A=UDV=UIDIV=U(S2)D(S2)V=(US)(SDS)(VS)

juga merupakan SVD dari karena menunjukkan bahwa memiliki kolom ortonormal dan perhitungan serupa menunjukkan memiliki kolom ortonormal. Selain itu, karena dan adalah diagonal, mereka berpindah-pindah, dari mana menunjukkan masih memiliki entri yang tidak negatif.( U S ) ( U S ) = S U U S = S I p S = S S = S 2A U S V S

(US)(US)=SUUS=SIpS=SS=S2=Ip
USVSD S D S = D S 2 = D DSD
SDS=DS2=D
D

Metode yang diterapkan dalam kode untuk menemukan SVD menemukan yang mendiagonalisasi dan, juga, sebuah yang mendiagonalisasi Ini mulai menghitung dalam hal nilai eigen yang ditemukan dalam . Masalahnya adalah ini tidak menjamin pencocokan konsisten kolom dengan kolom .A A = ( U D V ) ( U D V ) U V A A = V D 2 V . D D 2 U V

AA=(UDV)(UDV)=UDVVDU=UD2U
V
AA=VD2V.
DD2UV

Sebuah solusi

Alih-alih, setelah menemukan dan seperti itu , gunakan untuk menghitungVUV

UAV=U(UDV)V=(UU)D(VV)=D

secara langsung dan efisien. Nilai-nilai diagonal ini tidak selalu positif. D (Itu karena tidak ada apa-apa tentang proses mendiagonalisasi baik atau yang akan menjamin bahwa, karena kedua proses itu dilakukan secara terpisah.) Buat mereka positif dengan memilih entri di sepanjang diagonal untuk menyamakan tanda-tanda entri , sehingga memiliki semua nilai positif. Kompensasi untuk ini dengan mengalikan kanan dengan :AAAAASDSDUS

A=UDV=(US)(SD)V.

Itu adalah SVD.

Contoh

Misalkan dengan . SVD adalahn=p=k=1A=(2)

(2)=(1)(2)(1)

dengan , , dan .U=(1)D=(2)V=(1)

Jika Anda mendiagonalisasi Anda secara alami akan memilih dan . Demikian juga jika Anda mendiagonalisasi Anda akan memilih . Sayangnya, Sebaliknya, hitung Karena ini negatif, atur . Ini menyesuaikan ke dan ke . Anda telah memperoleh yang merupakan salah satu dari dua SVD yang mungkin (tetapi tidak sama dengan yang asli!).AA=(4)U=(1)AA=(4)V=(1)=D=(4)=(2)AA=(4)V=(1)

UDV=(1)(2)(1)=(2)A.
D=UAV=(1)(2)(1)=(2).
S=(1)UUS=(1)(1)=(1)DSD=(1)(2)=(2)
A=(1)(2)(1),

Kode

Berikut adalah kode yang dimodifikasi. Hasilnya menegaskan

  1. Metode ini dibuat ulang mdengan benar.
  2. VU dan benar-benar masih normal.V
  3. Tetapi hasilnya bukan SVD yang sama dikembalikan oleh svd. (Keduanya sama-sama valid.)
m <- matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U <- eigen(tcrossprod(m))$vector
V <- eigen(crossprod(m))$vector
D <- diag(zapsmall(diag(t(U) %*% m %*% V)))
s <- diag(sign(diag(D)))  # Find the signs of the eigenvalues
U <- U %*% s              # Adjust the columns of U
D <- s %*% D              # Fix up D.  (D <- abs(D) would be more efficient.)

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d,n,n)

zapsmall(U1 %*% D1 %*% t(V1)) # SVD
zapsmall(U %*% D %*% t(V))    # Hand-rolled SVD
zapsmall(crossprod(U))        # Check that U is orthonormal
zapsmall(tcrossprod(V))       # Check that V' is orthonormal
whuber
sumber
1
+1. Ini sangat jelas. Saya hanya akan menambahkan bahwa dalam praktiknya cukup untuk menghitung salah satu Uatau Vkemudian untuk mendapatkan matriks lain melalui mengalikan dengan A. Dengan cara ini seseorang hanya melakukan satu (bukan dua) komposisi eigend, dan tanda-tanda akan keluar dengan benar.
amoeba
2
@Amoeba Itu benar: dalam semangat menghitung-tangan suatu SVD, yang jelas merupakan latihan pendidikan, tidak ada perhatian diberikan pada efisiensi.
whuber
2
Terima kasih atas bantuannya! Saya rasa saya mengerti masalah ini (akhirnya).
gagal ahli statistik
3
@Federico Terima kasih atas pengingat itu. Anda cukup benar - saya secara implisit mengasumsikan semua nilai eigen berbeda, karena memang hampir pasti akan menjadi kasus dalam aplikasi statistik dan seseorang keluar dari kebiasaan mempertimbangkan ambiguitas dengan ruang eigens "degenerasi".
whuber
3
Anda benar, ini hanya kasus tepi, dan memang rumit. Dalam hal tertentu, itu adalah manifestasi lain dari masalah yang sama yang Anda menguraikan dalam jawaban Anda, bahwa metode ini tidak menjamin "cocok" antara kolom dari dan . Menghitung SVD mulai dari komposisi eigend masih merupakan contoh pembelajaran yang bagus. UV
Federico Poloni
5

Seperti yang saya uraikan dalam komentar ke jawaban @ whuber, metode ini untuk menghitung SVD tidak bekerja untuk setiap matriks . Masalahnya tidak terbatas pada tanda-tanda.

Masalahnya adalah bahwa mungkin ada nilai eigen yang berulang, dan dalam hal ini komposisi eigend dari dan tidak unik dan tidak semua pilihan dan dapat digunakan untuk mengambil faktor diagonal dari SVD. Misalnya, jika Anda mengambil matriks ortogonal non-diagonal (misalnya, ), maka . Di antara semua pilihan yang mungkin untuk matriks vektor eigen , akan mengembalikan , sehingga dalam hal ini tidak diagonal.A A ' U V A = [ 3 / 5 4 / 5 - 4 / 5 3 / 5 ] A A ' = AAAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

Secara intuitif, ini adalah manifestasi lain dari masalah yang sama yang menguraikan @whuber, bahwa harus ada "kecocokan" antara kolom dan , dan menghitung dua komposisi eigend secara terpisah tidak memastikannya.UV

Jika semua nilai singular berbeda, maka komposisi eigend unik (hingga skala / tanda) dan metode ini bekerja. Catatan: itu masih bukan ide yang baik untuk menggunakannya dalam kode produksi pada komputer dengan aritmatika floating point, karena ketika Anda membentuk produk dan hasil yang dihitung dapat terganggu oleh jumlah urutan , di mana adalah presisi mesin. Jika besarnya nilai singular sangat berbeda (lebih dari , kira-kira), ini merugikan akurasi numerik dari yang terkecil.A A A A A 2 u u 2 × 10 - 16 10 - 8AAAAAA2uu2×1016108

Komputasi SVD dari dua komposisi eigend adalah contoh pembelajaran yang bagus, tetapi dalam kehidupan nyata aplikasi selalu menggunakan svdfungsi R untuk menghitung dekomposisi nilai singular.

Federico Poloni
sumber
1
Komentar ini adalah saran yang bagus. Harap dicatat, bahwa utas ini tidak peduli tentang cara yang tepat untuk menghitung SVD (dan saya yakin tidak ada yang akan menentang rekomendasi Anda). OP secara implisit menerima bahwa itu svdberfungsi. Memang, mereka menggunakannya sebagai standar untuk membandingkan perhitungan tangan, yang tujuannya adalah untuk memeriksa pemahaman, bukan untuk menggantikan svddengan cara apa pun.
whuber
@whuber Pengamatan yang benar; Saya menulis ulang paragraf terakhir.
Federico Poloni