Phân tích vấn đề
SVD của một ma trận không bao giờ là duy nhất. Đặt ma trận có kích thước và để SVD của nó làn × kAn×k
A=UDV′
đối với ma trận ma trận với các cột trực giao, ma trận ma trận với các mục không âm và ma trận ma trận với các cột trực giao.U p × p D k × p Vn×pUp×pDk×pV
Bây giờ, chọn tùy ý , bất kỳ đường chéo ma trận có s trên đường chéo, sao cho là nhận dạng . Sau đóS ± 1 S 2 = I p × p I pp×pS±1S2=Ip×pIp
A=UDV′=UIDIV′=U(S2)D(S2)V′=(US)(SDS)(VS)′
cũng là một SVD của vì chứng tỏ có các cột trực giao và một tính toán tương tự chứng minh có các cột trực giao. Hơn nữa, vì và là đường chéo, chúng đi lại, từ đó cho thấy vẫn có các mục không âm.( U S ) ′ ( U S ) = S ′ U ′ U S = S ′ I p S = S ′ S = S 2 =A U S V S S D S D S = D S 2 = D D
(US)′(US)=S′U′US=S′IpS=S′S=S2=Ip
USVSSDSDS=DS2=D
D
Phương thức được triển khai trong mã để tìm một SVD tìm thấy một có đường chéo và tương tự, một chéo Nó tiến hành tính toán theo các giá trị riêng được tìm thấy trong . Vấn đề là điều này không đảm bảo một kết hợp phù hợp của các cột của với các cột của .Một Một ' = ( U D V ' ) ( U D V ' ) ' = U D V ' V D ' U ' = U D 2 U ' V Một ' Một = V D 2 V ' . D D 2 U VU
AA′=(UDV′)(UDV′)′=UDV′VD′U′=UD2U′
VA′A=VD2V′.
DD2UV
Một giải pháp
Thay vào đó, sau khi tìm thấy một và như vậy , hãy sử dụng chúng để tính toánVUV
U′AV=U′(UDV′)V=(U′U)D(V′V)=D
trực tiếp và hiệu quả. Các giá trị đường chéo của này không nhất thiết là dương. D (Đó là bởi vì không có gì về quá trình diagonalizing hoặc là hoặc đó sẽ đảm bảo rằng, kể từ khi hai quá trình được thực hiện riêng rẽ.) Làm cho họ tích cực bằng cách chọn các mục dọc theo đường chéo của bằng với dấu của các mục của , để có tất cả các giá trị dương. Bồi thường cho điều này bằng cách nhân với :A A ′ S D S D U SA′AAA′SDSDUS
A=UDV′=(US)(SD)V′.
Đó là một SVD.
Thí dụ
Đặt với . Một SVD làn=p=k=1A=(−2)
(−2)=(1)(2)(−1)
với , và .U=(1)D=(2)V=(−1)
Nếu bạn chéo bạn sẽ tự nhiên chọn và . Tương tự như vậy, nếu bạn chéo hóa bạn sẽ chọn . Thật không may, Thay vào đó, hãy tính Vì đây là số âm nên đặt . Điều này điều chỉnh thành và thành . Bạn đã thu được đây là một trong hai SVD có thể (nhưng không giống với bản gốc!).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),
Mã
Đây là mã sửa đổi. Đầu ra của nó xác nhận
- Phương pháp tạo lại
m
chính xác.
- VU và thực sự vẫn còn trực giao.V
- Nhưng kết quả không giống với SVD được trả về
svd
. (Cả hai đều có giá trị như nhau.)
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