공부하는 단계에서 정리한 내용입니다.
잘못된 내용이 있다면 말씀해주시면 감사하겠습니다.
https://mml-book.github.io/book/mml-book.pdf

4.5.2 Construction of the SVD
이번 section에서는 왜 SVD가 항상 존재하는지, 그리고 SVD를 어떻게 계산하는지에 대해서 알아볼 것이다.
SVD는 정사각행렬의 eigendecomposition과 비슷한 면이 있다.
Remark.
SPD(symmetric positive definite) 행렬 S의
eigendecomposition은 S=S⊤=PDP⊤이고
SVD는 S=UΣV⊤ 이다.
만약 U=P=V이고 D=Σ 일 때 eigendecomposition과 SVD가 같아진다.
이제 본격적으로 SVD를 어떻게 계산하는지 알아볼 것이다.
m×n 행렬 A를 계산하는 것은 두 orthonormal bases U=(u1,⋯,um)과 V=(v1,⋯,vn)을 구하는 것과 같다. 이렇게 계산된 bases들로 행렬 U와 V를 만들 것이다.
총 4단계로 구성된다.
1. 먼저 right-singular vector의 orthonormal set v1,⋯,vn 부터 만든다.
-> Rm의 벡터들을 새로운 basis로 정렬해야 하는데, 이 중에서 가장 깔끔한 축을 찾아야 하기 때문
Spectral theorem에서 대칭행렬의 eigenvector들은 ONB, 즉 diagonalize 할 수 있음을 알 수 있다.
그리고 Theorem 4.14에서 m×n 행렬 A에 대해서 항상 symmetric, positive semidefinite한 n×n 행렬 A⊤A를 만들 수 있음을 알 수 있다.
그러므로 A⊤A를 항상 diagonalize 시킬 수 있고, A⊤A=PDP⊤=P[λ1⋯0⋮⋱⋮0⋯λn]P⊤ 가 된다.
여기서 λi≥0은 A의 eigenvalue 들이다.
A의 SVD가 존재한다고 가정하고, A⊤A에 A=UΣV⊤ 을 넣어보자. 그러면 아래와 같이 전개된다.
A⊤A=(UΣV⊤)⊤(UΣV⊤)=VΣ⊤U⊤UΣV⊤=VΣ⊤ΣV⊤=V[λ12000⋱000λn2]V⊤
위의 두 식을 비교해보면 V⊤=P⊤이고 σ2i=λi임을 알 수 있다.
- 행렬 P(A⊤A의 eigenvector들)가 A의 right-singular vector임
- A⊤A의 eigenvalue들은 Σ의 singular value들의 제곱임
2. 그다음에 left-singular vector의 orthonormal set u1,⋯,um 을 만든다.
-> V⊤와 Σ를 거치면서 크기가 조정되었고, 마지막으로 Rn에 맞춰서 새로운 방향으로 정렬해야 함
Left-singular vector U를 구할 때도 비슷한 과정을 거친다.
먼저 AA⊤의 SVD를 구한다.
AA⊤=(UΣV⊤)(UΣV⊤)⊤=UΣV⊤VΣ⊤U⊤=U[σ21000⋱000σ2m]U⊤
AA⊤은 대칭행렬이므로 spectral theorem에 의해서 diagonalize 할 수 있으므로 AA⊤=SDS⊤이다.
이때 얻어지는 eigenvector S가 SVD의 left-singular vector가 된다.
이제 Σ만 구하면 된다. AA⊤과 A⊤A가 동일한 nonzero eigenvalue를 가지므로, SVD에서의 nonzero entry들도 동일해야 한다.
3. 이렇게 구한 두 집합을 연결해서 A가 적용되었을 때 vi들의 orthogonality가 유지되도록 한다.
두 집합 U와 V를 연결하기 위해서 A에 의해서 변환된 vi들도 orthogonal 해야 한다는 사실을 이용할 것이다.
Section 3.4에서 i≠j 일 때, Avi와 Avj의 내적이 0이 되어야 한다. 즉, A가 변환한 벡터들이 서로 직교해야 함을 배웠다.
즉, 서로 다른 vi와 vj가 orthogonal eigenvector라면 아래 식이 성립한다.
(Avi)⊤(Avj)=vi⊤A⊤Avj=vi⊤(λivj)=λivi⊤vj=0
m≥r 일 때, Av1,⋯,Avr이 Rm의 r차원 부분공간의 baiss가 된다.
4. 그리고 이렇게 변환된 벡터들을 스칼라 인자들로 정규화해서 singular vector(U하고 V에 속해있는 벡터)를 구한다.
SVD를 완성하기 위해서 우리는 orthonormal한 left-singular vector(ui)들이 필요하다.
아래와 같이 right-singular vector의 Avi들을 정규화하면 ui들을 얻을 수 있다.
ui:=Avi‖Avi‖=1√λiAvi=1σiAvi
(+ 중간에 왜 ‖Avi‖=√λi인지 전개해봤다.)

따라서 vi와 ui가 Σ를 통해서 연결된다.
위에서 온 ui=1σiAvi를 아래와 같이 다시 쓸 수 있다.
Avi=σiui(i=1,⋯,r(=rank))
보면 eigenvalue 방정식하고 비슷하지만, 좌변과 우변의 벡터가 다르다.
즉, SVD에서는 변환 후에 벡터의 방향이 바뀜을 알 수 있다!
n≤m 일 때, 모든 i⩽n에 대해서 성립하지만 i>n인 ui이 존재하긴 한다. 그냥 남아있는 basis 라고 생각하면 된다.
m≤n일 때도 마찬가지이다.
즉, SVD가 A의 null space(Ax=0)도 찾을 수 있다는 뜻이다!
Avi=σiui에서 vi를 모아서 행렬 V로, ui를 모아서 행렬 U로 만들면 아래와 같아진다.
AV=UΣ
여기서 양변에 V⊤을 곱하면 아래와 같이 A의 SVD가 나온다.
A=UΣV⊤
Ex 4.13 (Computing the SVD)
행렬 A=[101−210]의 SVD를 구해보자.
그러려면 right-singular vector들 vi, singular value들 σk, left-singular vector들 ui를 구해야 한다.
아래와 같이 3단계에 걸쳐서 구하면 된다.
보통 singular value는 σ1⩾σ2⩾⋯σr⩾0 순으로 정렬된다.
(앞 포스팅에서 포스팅했던 Theorem 4.22 아래쪽에 나와있음..)
(틀린 풀이)
이거 까먹고 처음에 그냥 아래처럼 오름차순으로 계산했는데 어딘가 이상했음. 검산을 했는데 A가 [101−210]가 안 나옴

(수정해서 맞은 풀이)
Sigular value가 σ1⩾σ2⩾⋯σr⩾0 순으로 정렬되어야 하기 때문에 eigenvalue부터 내림차순으로 정렬해줬다.

끝!!!
이것도 오래 걸렸다.
점점 감을 잡아가는 것 같기도 하다.
근데 이게 어디에 쓰이는지는 아직 잘 모르겠다.