Sorunun Analizi
Bir matrisin SVD'si asla benzersiz değildir. matrisinin boyutlarına sahip olmasına ve SVD'sininAn×k
A=UDV′
ortonormal sütunları olan bir matrisi , negatif olmayan girişleri olan bir çapraz matrisi ve ortonormal sütunları olan bir matrisi için.n×pUp×pDk×pV
Şimdi, keyfi olarak , diyagonal üzerinde s olan herhangi bir çapraz matrisi , böylece , kimliği . Sonrap×pS±1S2=Ip×pIp
A=UDV′=UIDIV′=U(S2)D(S2)V′=(US)(SDS)(VS)′
aynı zamanda , bir SVD için gösterir ortonormal sütun var ve benzer bir hesaplama gösteriyor ortonormal sütun var. Dahası, ve diyagonal olduğundan, işe giderler, bu nedenle , hala negatif olmayan girişleri olduğunu gösterir.A
(US)′(US)=S′U′US=S′IpS=S′S=S2=Ip
USVSSDSDS=DS2=D
D
SVD bulmak için kodda uygulanan yöntem köşegenleştiren bir bulur ve benzer şekilde köşegenleştiren bir bulunan özdeğerler açısından hesaplamasına devam eder . Sorun, bu sütunlarının sütunlarıyla tutarlı bir şekilde eşleşmesini sağlamaz .U
birbir'= ( UDV') ( UDV')'= UDV'VD'U'= UD2U'
Vbir'A = VD2V'.
DD2UV
Bir çözüm
Bunun yerine, böyle bir ve böyle bir bulduktan sonra , bunları hesaplamak için kullanın.UV
U'A V=U'( UDV') V= (U'U) D (V'V) = D
doğrudan ve verimli. Bu nin diyagonal değerleri mutlaka pozitif değildir. D (Bunun nedeni, veya köşegenleştirme işlemi hakkında, bu iki işlem ayrı olarak gerçekleştirildiğinden, bunu garanti edecek hiçbir şey olmamasıdır .) girdilerinin işaretleri eşit böylece, tüm olumlu değerleri vardır. Bunu ile çarparak telafi edin :bir'birbirbir'SDSDUS
A = UDV'= ( US) ( SD )V'.
Bu bir SVD.
Misal
Let olan . SVDn = p = k = 1A = ( - 2 )
( - 2 ) = ( 1 ) ( 2 ) ( - 1 )
ile , ve .U= ( 1 )D = ( 2 )V=(−1)
köşegenize ederseniz, doğal olarak ve seçersiniz . Aynı şekilde köşegenize ederseniz seçersiniz . Ne yazık ki, Bunun yerine, Bu negatif olduğu için . Bu ayarlar için ve için . Eğer elde edilmiştir iki olası SVDs biri (ancak özgün olarak aynı değildir!).A′A=(4)U=(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 ) ,
kod
İşte değiştirilmiş kod. Çıktıları
- Yöntem
m
doğru şekilde yeniden oluşturulur .
- U ve gerçekten hala birimdik.V
- Ancak sonuç, geri gönderilen SVD ile aynı değildir
svd
. (Her ikisi de eşit derecede geçerlidir.)
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