Tại sao tôi không thể có được SVD hợp lệ của X thông qua phân tách eigenvalue của XX 'và X'X?


9

Tôi đang cố gắng làm SVD bằng tay:

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)

Nhưng dòng cuối cùng không quay trở mlại. Tại sao? Nó dường như có liên quan đến các dấu hiệu của những người bản địa này ... Hay tôi đã hiểu sai quy trình?



Tôi liên tục nói rằng dấu hiệu đó không thành vấn đề trong các SVD ... như thế này
failstatistician

@Amoeba Cảm ơn bạn đã làm rõ điều đó. Tôi đã tập trung vào câu hỏi tiếng Anh hơn là mã. Failsstatistician: xem những gì D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))hiện và ghi nhớ rằng căn bậc hai (cũng như bất kỳ hàm riêng nào được chuẩn hóa) chỉ được định nghĩa để ký. Đối với cái nhìn sâu sắc hơn, thay đổi mđến m <- matrix(-2,1,1)và bao gồm ,1,1)ở phần cuối của mỗi cuộc gọi đến diag. Đây là ví dụ tạo ra cùng một vấn đề - nhưng thật đơn giản, bản chất của vấn đề sẽ trở nên hoàn toàn rõ ràng. 1×1
whuber

1
Hiểu rồi. Cảm ơn bạn! Bạn có một quy tắc chung để xác định vectơ c (-1, 1, 1) không? Hoặc làm thế nào các dấu hiệu của hai phân tách nên được liên kết?
failstatistician

1
Lưu ý rằng thủ thuật @ whuber c(-1,1,1)không hoạt động, nhưng Dđược định nghĩa như thế không mang lại cho bạn các giá trị số ít. Tất cả các giá trị số ít phải tích cực theo định nghĩa. Câu hỏi làm thế nào để liên kết các dấu hiệu UVlà tốt, và tôi không có câu trả lời. Tại sao bạn không làm một SVD? :-)
amip

Câu trả lời:


13

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)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=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)=UDVVDU=UD2U
V
AA=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

UAV=U(UDV)V=(UU)D(VV)=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 SAAAASDSDUS

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!).AA=(4)U=(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),

Đây là mã sửa đổi. Đầu ra của nó xác nhận

  1. Phương pháp tạo lại mchính xác.
  2. VU và thực sự vẫn còn trực giao.V
  3. 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

1
+1. Điều này rất rõ ràng. Tôi chỉ thêm rằng trong thực tế, nó đủ để tính toán Uhoặc Vsau đó để có được một ma trận khác thông qua nhân với A. Bằng cách này, người ta chỉ thực hiện một (thay vì hai) quá trình xuất tinh và các dấu hiệu sẽ xuất hiện đúng.
amip

2
@Amoeba Đúng vậy: theo tinh thần tính toán bằng tay một SVD, rõ ràng là một bài tập giáo dục, không có sự chú ý nào ở đây để đạt hiệu quả.
whuber

2
Cảm ơn lòng giúp đỡ tốt bụng của bạn! Tôi nghĩ rằng tôi hiểu vấn đề này (cuối cùng).
failstatistician

3
@Federico Cảm ơn bạn đã nhắc nhở. Bạn hoàn toàn chính xác - Tôi đã mặc nhiên cho rằng tất cả các giá trị riêng đều khác biệt, vì thực sự đó gần như chắc chắn sẽ là trường hợp trong các ứng dụng thống kê và người ta thoát khỏi thói quen xem xét sự mơ hồ với các dấu hiệu "thoái hóa".
whuber

3
Bạn đã đúng, đây chỉ là một trường hợp cạnh, và một khó khăn thực sự. Trong một nghĩa nào đó, nó là một biểu hiện của cùng một vấn đề mà bạn vạch ra trong câu trả lời của bạn, rằng phương pháp này không đảm bảo một "phù hợp" giữa các cột của và . Việc tính toán SVD bắt đầu từ các eigendecysis vẫn là một ví dụ học tập tuyệt vời. VUV
Federico Poloni

5

Như tôi đã phác thảo trong một nhận xét cho câu trả lời của @ whuber, phương pháp này để tính toán SVD không hoạt động cho mọi ma trận . Vấn đề không giới hạn ở các dấu hiệu.

Vấn đề là có thể có các giá trị riêng lặp đi lặp lại, và trong trường hợp này, sự xuất tinh của và không phải là duy nhất và không phải tất cả các lựa chọn của và đều có thể được sử dụng để lấy ra hệ số đường chéo của SVD. Chẳng hạn, nếu bạn lấy bất kỳ ma trận trực giao không đường chéo nào (giả sử, ), thì . Trong số tất cả các lựa chọn có thể cho ma trận eigenvector của , sẽ trả về , do đó trong trường hợp này không phải là đường chéo.Một Một ' U V Một = [ 3 / 5 4 / 5 - 4 / 5 3 / 5 ] Một Một ' =AAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

Theo trực giác, đây là một biểu hiện khác của cùng một vấn đề mà @whuber vạch ra, rằng phải có một "khớp" giữa các cột của và và tính toán hai phép tách riêng không đảm bảo điều đó.UV

Nếu tất cả các giá trị số ít của là khác biệt, thì quá trình xuất tinh là duy nhất (tối đa tỷ lệ / dấu hiệu) và phương thức hoạt động. Lưu ý: vẫn không nên sử dụngnày trong mã sản xuất trên máy tính có số học dấu phẩy động, bởi vì khi bạn tạo các sản phẩm và , kết quả tính toán có thể bị nhiễu bởi một lượng thứ tự , trong đó là độ chính xác của máy. Nếu độ lớn của các giá trị số ít khác nhau rất nhiều (khoảng hơn , đại khái), thì điều này gây bất lợi cho độ chính xác bằng số của các giá trị nhỏ nhất.Một ' Một Một Một 'Một 2 u u 2 × 10 - 16 10 - 8AAAAAA2uu2×1016108

Tính toán SVD từ hai phép phân tích điện tử là một ví dụ học tập tuyệt vời, nhưng trong các ứng dụng thực tế luôn sử dụng svdhàm R để tính toán phân tách giá trị số ít.


1
Nhận xét này là lời khuyên tốt. Tuy nhiên, xin lưu ý rằng chủ đề này không quan tâm đến cách tính toán SVD thích hợp (và tôi tin rằng không ai sẽ tranh cãi với đề xuất của bạn). OP ngầm chấp nhận rằng svdhoạt động. Thật vậy, họ sử dụng nó như một tiêu chuẩn để so sánh tính toán tay, mục đích của họ là kiểm tra sự hiểu biết, không thay thế svdbằng bất kỳ cách nào.
whuber

@whuber Quan sát đúng; Tôi viết lại đoạn cuối.
Federico Poloni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.