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)=S′U′US=S′IpS=S′S=S2=Ip
USVSD S D S = D S 2 = D DSDSDS=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′)′=UDV′VD′U′=UD2U′
VA′A=VD2V′.
DD2UV
Sebuah solusi
Alih-alih, setelah menemukan dan seperti itu , gunakan untuk menghitungVUV
U′AV=U′(UDV′)V=(U′U)D(V′V)=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 :AA′AAA′SDSDUS
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!).A′A=(4)U=(1)AA′=(4)V=(1)=D=(4–√)=(2)AA′=(4)V=(1)
UDV′=(1)(2)(1)=(2)≠A.
D=U′AV=(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
- Metode ini dibuat ulang
m
dengan benar.
- VU dan benar-benar masih normal.V
- 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