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 m
kembali. Mengapa? Tampaknya ada hubungannya dengan tanda-tanda vektor eigen ini ... Atau apakah saya salah memahami prosedur?
r
svd
eigenvalues
ahli statistik yang gagal
sumber
sumber
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, perubahanm
kem <- matrix(-2,1,1)
dan termasuk,1,1)
pada akhir masing-masing panggilan kediag
. Ini adalah contoh yang menciptakan masalah yang sama - tetapi sangat sederhana sifat masalah akan menjadi sangat jelas.c(-1,1,1)
berhasil, tetapiD
didefinisikan seperti itu tidak memberi Anda nilai tunggal. Nilai singular semua harus positif menurut definisi. Pertanyaan tentang bagaimana menghubungkan tanda-tandaU
danV
baik, dan saya tidak punya jawaban. Mengapa Anda tidak melakukan SVD saja? :-)Jawaban:
Analisis Masalah
SVD suatu matriks tidak pernah unik. Biarkan matriks memiliki dimensi dan biarkan SVD-nyan × kA n×k
untuk matriks dengan kolom ortonormal, diagonal matriks dengan entri non-negatif, dan matriks dengan kolom ortonormal.U p × p D k × p Vn×p U p×p D k×p V
Sekarang pilih, secara sewenang-wenang , setiap diagonal matriks memiliki s di diagonal, sehingga adalah identity . KemudianS ± 1 S 2 = I p × p I pp×p S ±1 S2=I p×p Ip
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
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
Sebuah solusi
Alih-alih, setelah menemukan dan seperti itu , gunakan untuk menghitungVU V
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 :AA′A AA′ S D SD U S
Itu adalah SVD.
Contoh
Misalkan dengan . SVD adalahn=p=k=1 A=(−2)
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!).A′A=(4) U=(1) AA′=(4)V=(1)=D=(4–√)=(2) AA′=(4) V=(1)
Kode
Berikut adalah kode yang dimodifikasi. Hasilnya menegaskan
m
dengan benar.svd
. (Keduanya sama-sama valid.)sumber
U
atauV
kemudian untuk mendapatkan matriks lain melalui mengalikan denganA
. Dengan cara ini seseorang hanya melakukan satu (bukan dua) komposisi eigend, dan tanda-tanda akan keluar dengan benar.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 ' = AA′A AA′ U V A=[3/5−4/54/53/5] AA′=A′A=I I U=V=I U′AV=A
eigen
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.U V
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 - 8A A′A AA′ ∥A∥2u u≈2×10−16 10−8
Komputasi SVD dari dua komposisi eigend adalah contoh pembelajaran yang bagus, tetapi dalam kehidupan nyata aplikasi selalu menggunakan
svd
fungsi R untuk menghitung dekomposisi nilai singular.sumber
svd
berfungsi. Memang, mereka menggunakannya sebagai standar untuk membandingkan perhitungan tangan, yang tujuannya adalah untuk memeriksa pemahaman, bukan untuk menggantikansvd
dengan cara apa pun.