문제 분석
행렬의 SVD는 고유하지 않습니다. 행렬 크기를 하고 SVD를ㅏn × k
A = U디V'
정규 직교 열 을 갖는 행렬 , 음이 아닌 엔트리를 갖는 대각선 행렬 , 및 정규 직교 열을 갖는 행렬 .n × pUp×pDk×pV
이제 대각선에 s 인 대각선 행렬 를 임의로 선택 하여 가 identity 합니다. 그때p×pS±1S2=Ip×pIp
A=UDV′=UIDIV′=U(S2)D(S2)V′=(US)(SDS)(VS)′
는 이 직교 정규 열을 가지고 있기 때문에 의 SVD 이기도 합니다. 비슷한 계산은 에 직교 정규 열이 있음을 보여줍니다 . 또한 와 는 대각선이므로 는 여전히 음이 아닌 항목이 있음을 보여줍니다 .A
(US)′(US)=S′U′US=S′IpS=S′S=S2=Ip
USVSSDSDS=DS2=D
D
SVD를 찾기 위해 코드에서 구현 된 메소드는 를 대각선으로 하는 를 찾습니다. 및 이와 유사하게 을 대각선으로 하는 입니다 에있는 고유 값으로 를 계산 합니다. 문제는 의 열과 의 열이 일관되게 일치하지 않는다는 것 입니다.U
AA′=(UDV′)(UDV′)′=UDV′VD′U′=UD2U′
VA′A=VD2V′.
DD2UV
해결책
대신, 그러한 와 찾은 후에 는이 를 사용하여 계산하십시오.UV
U′AV=U′(UDV′)V=(U′U)D(V′V)=D
직접적이고 효율적으로. 이 의 대각선 값이 반드시 양수인 것은 아닙니다. D ( 또는 을 대각선으로 처리하는 프로세스는 없기 때문에 두 프로세스가 별도로 수행 되었기 때문에이를 보장 할 수 있기 때문입니다.) 의 대각선을 따라 항목을 선택하여 긍정적으로 만듭니다. 모든 양수 값을 갖도록 항목의 부호와 같습니다 . 에 를 오른쪽 곱하여이를 보상합니다 .A′AAA′SDSDUS
A=UDV′=(US)(SD)V′.
그것은 SVD입니다.
예
하자 가진 . SVD는n=p=k=1A=(−2)
(−2)=(1)(2)(−1)
함께 , 및 .U=(1)D=(2)V=(−1)
를 대각선으로 기울이면 자연스럽게 및 됩니다. 마찬가지로 를 대각선 화 하면 선택합니다 . 불행하게도, 대신 음수이므로 . 이 조정한다 행 및 에 . 넌 얻은 두 개의 가능한 SVDs 중 하나 (그러나 일본어와 동일하지!).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
올바르게 재생성 됩니다.
- U 와 는 여전히 직교 정상입니다.V
- 그러나 결과는에서 반환 한 것과 같은 SVD가 아닙니다
svd
. (모두 유효합니다.)
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