XX '와 X'X의 고유 값 분해를 통해 유효한 X의 SVD를 얻을 수없는 이유는 무엇입니까?


9

SVD를 손으로하려고합니다.

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)

그러나 마지막 줄은 m다시 돌아 오지 않습니다 . 왜? 이 고유 벡터의 표시와 관련이있는 것 같습니다 ... 아니면 절차를 오해 했습니까?



나는 반복 기호는 다음과 같이 ... SVDs에서 중요하지 않습니다 것을 듣는다
failedstatistician

@Amoeba 감사합니다. 나는 코드보다는 영어 질문에 집중하고 있었다. 실패한 통계 학자 : D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))제곱근 (및 정규화 된 고유 벡터)은 최대 부호만으로 정의됩니다. 더 많은 통찰력을 얻으 m려면에 대한 각 통화가 끝날 때로 변경 m <- matrix(-2,1,1)하고 포함 ,1,1)하십시오 diag. 이것은 동일한 문제를 만드는 예이지만 문제의 본질이 완전히 명백해질 것입니다. 1×1
whuber

1
알았다. 감사합니다! 벡터 c (-1, 1, 1)을 결정하는 일반적인 규칙이 있습니까? 아니면 두 분해의 징후가 어떻게 연결되어야합니까?
failedstatistician

1
@ whuber의 트릭 c(-1,1,1)은 작동하지만 그렇게 D정의하면 단수 값을 제공하지 않습니다. 특이 값은 모두 정의상 양수 여야합니다. 의 징후를 연결하는 방법에 대한 질문 UV좋은, 그리고 내가 대답을하지 않습니다. 왜 SVD를하지 않습니까? :-)
amoeba

답변:


13

문제 분석

행렬의 SVD는 고유하지 않습니다. 행렬 크기를 하고 SVD를An×k

A=UDV

정규 직교 열 을 갖는 행렬 , 음이 아닌 엔트리를 갖는 대각선 행렬 , 및 정규 직교 열을 갖는 행렬 .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)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=DS2=D
D

SVD를 찾기 위해 코드에서 구현 된 메소드는 를 대각선으로 하는 를 찾습니다. 및 이와 유사하게 을 대각선으로 하는 입니다 에있는 고유 값으로 를 계산 합니다. 문제는 의 열과 의 열이 일관되게 일치하지 않는다는 것 입니다.U

AA=(UDV)(UDV)=UDVVDU=UD2U
V
AA=VD2V.
DD2UV

해결책

대신, 그러한 와 찾은 후에 는이 를 사용하여 계산하십시오.UV

UAV=U(UDV)V=(UU)D(VV)=D

직접적이고 효율적으로. 이 의 대각선 값이 반드시 양수인 것은 아닙니다. D ( 또는 을 대각선으로 처리하는 프로세스는 없기 때문에 두 프로세스가 별도로 수행 되었기 때문에이를 보장 할 수 있기 때문입니다.) 의 대각선을 따라 항목을 선택하여 긍정적으로 만듭니다. 모든 양수 값을 갖도록 항목의 부호와 같습니다 . 에 를 오른쪽 곱하여이를 보상합니다 .AAAASDSDUS

A=UDV=(US)(SD)V.

그것은 SVD입니다.

하자 가진 . SVD는n=p=k=1A=(2)

(2)=(1)(2)(1)

함께 , 및 .U=(1)D=(2)V=(1)

를 대각선으로 기울이면 자연스럽게 및 됩니다. 마찬가지로 를 대각선 화 하면 선택합니다 . 불행하게도, 대신 음수이므로 . 이 조정한다 행 및 에 . 넌 얻은 두 개의 가능한 SVDs 중 하나 (그러나 일본어와 동일하지!).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),

암호

다음은 수정 된 코드입니다. 출력 확인

  1. 이 방법은 m올바르게 재생성 됩니다.
  2. U 와 는 여전히 직교 정상입니다.V
  3. 그러나 결과는에서 반환 한 것과 같은 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

1
+1. 이것은 매우 분명하다. 난 단지 실제로는 하나 계산하기에 충분하다는 추가 할 수 U또는 V다음과 곱하여 통해 다른 매트릭스를 얻을 A. 이런 식으로 하나만 (2 개가 아닌) 고유 분해를 수행하며 표시가 올바르게 나옵니다.
amoeba

2
@Amoeba 맞습니다. SVD를 손으로 계산하는 정신으로, 교육적인 운동 인 것 같습니다. 여기에는 효율성에 대한 관심이 없습니다.
whuber

2
당신의 친절한 도움에 감사드립니다! 나는이 문제를 (최종적으로) 이해한다고 생각합니다.
failedstatistician

3
@Federico 감사합니다. 당신은 매우 정확합니다. 저는 모든 고유 값이 고유하다고 가정했습니다. 왜냐하면 실제로는 통계적 응용에서 거의 확실하게 발생하고 "변성 된"고유 공간으로 모호성을 고려하는 습관에서 벗어날 수 있기 때문입니다.
whuber

3
당신은 맞습니다, 이것은 단지 대단한 경우이며, 까다로운 것입니다. 어떤 의미에서, 그것은 당신이 당신의 대답에서 설명한 것과 같은 문제의 또 다른 표현입니다.이 방법은 와 의 열 사이에 "일치하는"것을 보장하지 않습니다 . 고유 분해에서 시작하여 SVD를 계산하는 것은 여전히 ​​훌륭한 학습 예입니다. UV
Federico Poloni 2012

5

@ whuber의 답변에 대한 주석에서 설명했듯이 SVD를 계산하는이 방법은 모든 행렬에서 작동하지 않습니다 . 이 문제는 징후에만 국한되지 않습니다.

문제는 반복되는 고유 값이있을 수 있으며,이 경우 및 고유 가 고유하지 않으며 및 의 모든 선택 이 SVD의 대각선 인수를 검색하는 데 사용될 수는 없습니다. 예를 들어, 대각선이 아닌 직교 행렬 (예 : )을 하면 . 고유 벡터의 행렬의 모든 가능한 선택 중에서 , 반환 이러한 경우에 따라서 대각이 아니다.AAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

직관적으로 이것은 @whuber가 설명하는 동일한 문제의 또 다른 표현입니다 와 의 열 사이에 "일치"해야하며 두 개의 고유 분해를 개별적으로 계산해도 보장되지 않습니다.UV

모든 특이 값 경우 별개 다음 eigendecomposition은 (스케일링 / 간판까지) 독특한 방법의 작품이다. 비고 : 제품 및 를 형성 할 때 계산 된 결과가 의 차수만큼 교란 될 수 있기 때문에 부동 소수점 산술이있는 컴퓨터의 프로덕션 코드 코드 를 사용하는 것은 여전히 좋은 생각이 아닙니다. , 여기서 은 기계 정밀도입니다. 특이 값의 크기가 대략적으로 (대략 이상) 크게 다르면 이는 가장 작은 숫자의 정확도에 해 롭습니다.AAAAAA2uu2×1016108

두 개의 고유 분해에서 SVD를 계산하는 것은 훌륭한 학습 예이지만 실제 응용에서는 항상 R의 svd함수를 사용하여 단일 값 분해를 계산합니다.


1
이 의견은 좋은 조언입니다. 그러나이 스레드는 SVD를 계산하는 올바른 방법에 대해 걱정하지 않습니다 (그리고 아무도 귀하의 권장 사항에 대해 논쟁하지 않을 것이라고 생각합니다). OP는 암시 적으로 svd작동합니다. 실제로, 그들은 svd어떤 식 으로든 대체하지 않고 이해를 확인하는 것이 목적인 손 계산을 비교하는 표준으로 사용합니다 .
whuber

@whuber 정확한 관찰; 나는 마지막 단락을 바꾸었다.
Federico Poloni 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.