늘 고유값 대각화를 통해 행렬을 쪼갤 수 있다면 좋겠지만, 이 방법엔 아쉽게도 주어지는 행렬이 정방행렬이어야한다는 제한이 있다. 이에 대각화할 행렬을 정방행렬이 아닌 경우로 확장해서 분해하려고 한다.
빌드업
두 자연수m>n 에 대해 행렬 A∈Cm×n 의 계수가 rankA=n 으로 주어진다고 하자. 그러면 dimC(A)=dimC(AT)=n 으로, 이들의 정규직교벡터 v1,⋯,vn∈C(A) 과 u1,⋯,un∈C(AT) 을 생각할 수 있다.
고유값의 기하학적인 의미를 생각할 때와 마찬가지로
Avi=σiui
를 만족하는 σi>0 가 존재한다고 가정하자. 그러면 A 는 vi 의 방향을 ui 와 일치하도록 만드는 선형변환이고 σi>0 는 그 크기를 맞춰주는 것으로 볼 수 있다. 이러한 σi 는 고유값이 아니라 A 의 특이값이라 정의하는데, 아쉽게도 그 의미는 특이값 분해와 전혀 상관이 없다. 여기서 고유값에서의 논의와 달라지는 것은 A∈Cm×n, 즉 vi∈Cn 이고 ui∈Cm 이므로 A 가 벡터의 차원도 바꾼다는 것이다. 행렬 A 에 대해 정리해서 A=σiuivi∗ 이고 양변의 차원은 m×n=(m×1)×(1×n) 이 됨을 확인해보자. 한편 고유벡터와 달리 좌우가 구분이 되므로 ui 는 좌특이벡터 , vi 가 우특이벡터 로 정의된다는 것에 유의하자.이제 Avi=σiui 을 1≤i≤n 에 대해 풀어서 쓰면
A[v1v2⋯vn]=[u1u2⋯un]σ10⋮00σ2⋱⋯⋯⋱⋱00⋮0σm
간결한 표현을 위해서 아래와 같이 나타내도록 하자.
V:=[v1v2⋯vn]∈Cn×nU:=[u1u2⋯un]∈Cm×nΣ:=diag(σ1,σ2,⋯,σn)
편의상, σi≥σj>0 이라고 하자. 정리하면
AV=UΣ
이고 VV∗=V∗V=I 이므로
A=UΣV∗
물론 U∈Cm×n 이므로 U 가 유니터리 행렬은 아니지만, 정규직교성을 가지므로 U∗U=In 이고
A∗A====(UΣV∗)∗(UΣV∗)VΣU∗UΣV∗VΣ2V∗VΣ2V−1
A=Sλ10⋮00λ2⋱⋯⋯⋱⋱00⋮0λmS−1
이는 정방행렬A∗A∈Cm×m 에 대해서 고유값 대각화를 마친 결과로 볼 수 있다. σi2 는 A∗A 의 고유값이며 vi 는 σi2 에 해당하는 고유벡터가 되는 것이다. 이제 수치적인 계산을 위해 위의 과정을 거꾸로 거슬러 올라가보자.
A∗A 의 고유값 σ1≥σ2≥⋯≥σn>0 들을 찾는다. 임의의 x=0 에 대해서
x∗A∗Ax=∣∣Ax∣∣2>0
즉 A∗A 가 양의 정부호기 때문에 σi>0 임이 보장된다.
Step 2.
구한 고유값에 대응되는 고유벡터로 정규직교벡터 V=[v1v2⋯vn] 을 찾는다.
Step 3.
ui=σi1Avi 를 통해 U=[u1u2⋯un] 을 찾는다.
축소 특이값 분해와 전체 특이값 분해
이렇게 A=UΣV∗ 를 만족하는 세 행렬로 A 를 쪼개는 것을 축소reduced 특이값 분해(rSVD) 라고 한다.
이를 전체full 특이값 분해(fSVD) 와 구분하기 위해서 U 과 Σ 같은 표기가 쓰인 것이다.전체 특이값 분해의 아이디어는 단순히 축소 특이값 분해를 조금 확장한 것에 지나지 않는다. 정방행렬
U:=[Uun+1⋯um]∈Cm×m
가 유니터리 행렬이 되도록 하는 un+1,⋯,um 을 찾고, Σ 의 하단에 0 을 붙이는 식으로 m×n 행렬 Σ:=[ΣO]
를 구성해서 A=UΣV∗ 꼴로 분해하는 것이다.
fSVD 는 이론적으로 더 견고하고, rSVD 는 실제 계산에 더 유리할 것이다. 둘 중 뭐가 됐든 SVD를 구하라는 말은 곧 U 혹은 U, Σ 혹은 Σ, V 를 구하라는 말이다.