Loading [MathJax]/jax/output/HTML-CSS/jax.js

🖥️ 컴퓨터 싸이언스

수학 | 고윳값 분해(Eigen Decomposition)와 특이값 분해(Singular Value Decomposition)

노바깅 2023. 5. 15. 21:41

고윳값 분해와 특이값 분해는 선형대수에서 항상 다루는 내용인데, 이 참에 한 번 정리해보기로 했다. 연구실 대쁘가 많이 도와줬다!

 

고윳값 분해 (Eigenvalue Decomposition)

고윳값과 고유벡터

 고윳값 분해에 대해 소개하기에 앞서 고윳값(eigen value)과 고유벡터(eigen vector)의 의미를 먼저 알아보자. 

n x n 행렬 A에 대하여, [yellow]Av=λv[/yellow] 을 만족하는 0이 아닌 벡터 v가 존재한다면 숫자 λ는 행렬 A의 고윳값이며 v는 고윳값 λ에 해당하는 고유벡터이다. 즉, 기하학적으로 고유벡터 v는 행렬 A를 곱했을 때와 곱하기 전의 방향이 바뀌지 않는다는 특징을 가지고 있다.

 

고윳값 분해 정의

 여러 고유벡터 vi를 모아둔 행렬 V가 있다고 가정해보다. 행렬 V의 각 열은 고유벡터에 대응된다. 쨋든, 우리는 앞서 Av=λv를 만족하는 v가 고유벡터라고 했으니, AV=ΛV를 만족한다. 이 때, Λ는 대각행렬로, 각 대각 요소가 고유벡터 vi에 대응한다고 생각하면 된다. 그 다음, 모든 고유벡터들이 선형 독립이라면 역행렬이 존재할테니 아래와 같은 수식을 얻을 수 있고, 이를 고윳값 분해라고 한다. 즉 행렬 A를 고윳값을 대각 요소로 가지고 있는 대각행렬과 고유벡터 행렬로 분해하는 것이다.

A=VΛV1

 

 사실 나는 여기까지 이해하고 그래서 뭐가 좋다는거지? 했는데, 이게 분석할 때 용이하다고 한다. 예를 들어 행렬 A를 이용해서 벡터 x를 projection 시키면 Ax는 계속 바뀌어서 분석하기 어려울 것이다. 하지만 xA의 고유벡터의 조합으로 표현하면, x=c1v1+c2v2+c3v3 라고 표현할 수 있다고 하자. 그러면 Ax=λ1c1v1+λ2c2v2+λ3c3v3이 될것이다. 행렬 A의 고유벡터들은 행렬 A를 이용한 프로젝션 전후의 방향이 동일하므로 분석이 용이하다는 것이다.

 

기하학적 의미

 이걸 다시 기하학적으로 생각해보면 Ax는 벡터 x는 행렬 A를 이용해서 projection 된 결과를 의미한다. 이는 결국 우항에 해당하는 VΛV1x와 동일하다는 것이다. 가장 먼저 x에 곱해지는 행렬 V1은 벡터 x를 다른 공간으로 projection 하고, Λ를 이용해서 각 방향으로 늘려주고 마지막으로 행렬 V를 통해서 다른 공간으로 다시 projection 하는 것이다.

 

대칭 행렬의 고윳값 분해

 추가적으로 중요한 내용이 있는데, 바로 대칭 행렬 (symmetric matrix)에서의 고윳값 분해이다. (이는 SVD와도 연결지을 수 있음!) 만약 행렬 A가 대칭 행렬이라면, A=AT를 만족한다. 따라서 아래 수식을 만족한다. 

A=VΛV1=AT=(VΛV1)T=(V1)TΛTVT

 위의 식에서 Λ는 대각행렬이므로 역시나 대칭행렬이고 아래를 만족한다.

VΛV1=(V1)TΛVT

 따라서, VVT=V1를 만족하는 직교행렬임을 알 수 있다.

 

특이값 분해 (Singluar Value Decomposition)

특이값 분해 정의

 그러면, 이제 특이값 분해에 대해 알아보자! 편의상 SVD라고 하겠다. SVD 역시 고윳값 분해와 마찬가지로 행렬을 분해하는 방법 중 하나이다. SVD는 행렬 A가 존재할 때, 서로 수직인 두 개의 벡터가 행렬 A를 이용해서 projection 해도 수직인 상태를 유지하는 것에 집중한다고 볼 수 있다.

 특이값 분해는 아래와 같이 정의할 수 있다. 고윳값 분해와 달리 A가 정방행렬일 필요가 없다.

A=UΣVT

  • A는 분해하려고 하는 행렬로 m x n 크기의 행렬이다.
  • U는 m x m 크기의 orthogonal 행렬로, UTU=UUT=I이고 U1=UT를 만족한다.
  • Σ는 m x n 크기의 대각행렬이다.
  • V는 n x n 크기의 orthogonal한 행렬이다.

 위의 식을 조금 변형하면 AV=UΣ 가 되는데, 앞서 언급했듯이 VU는 orthogonal하다. 따라서, 각 행렬 안에 있는 벡터들은 서로 orthogonal (내적하면 0) 하다. 가장 처음에 언급했던 것 처럼, 서로 수직인 두 벡터 (V안에 있는 임의 두 벡터)는 행렬 A를 이용해서 projection해도 수직인 상태이다. U가 orthonomal matrix니까!

 

고윳값 분해와는 무슨 관계?

 이제 고윳값 분해와 연결을 지어보자! 고윳값 분해는 안타깝게도 행렬 A가 정방 행렬일때만 적용할 수 있다고 했다. 만약 A가 m x n 크기라면은 고윳값 분해를 적용하지 못 한다는 것이다. 그러면 A를 이용해서 정방행렬을 만들어보자! AAT는 m x m 인 정방행렬이 되고, ATA는 n x n인 정방행렬이 될 것이다. 먼저 AAT에 대해서 풀어보면 아래와 같다.

AAT=UΣVT(UΣVT)T

=UΣVTVΣTUT

=U(ΣΣT)UT

 위의 식은 AAT를 고윳값 분해한 것이라고 볼 수 있다. UAAT의 고유벡터들로 구성된 행렬이 된다. 마찬가지로 ATA에 대해서 풀어보면, VATA의 고유벡터들로 구성된 행렬이라고 볼 수있다.

 

차원 축소와 SVD?

 어떻게 보면 SVD에서 가장 중요한 포인트라고 볼 수도 있을 것 같다. SVD를 이용해서 행렬 AU,Σ,VT로 분해했다면,  t개의 특이값(singular value)에 해당하는 부분 행렬들을 이용해 A 로 부분 복원할 수 있다.

https://angeloyeo.github.io/2019/08/01/SVD.html#%ED%8A%B9%EC%9D%B4%EA%B0%92-%EB%B6%84%ED%95%B4%EC%9D%98-%EB%AA%A9%EC%A0%81

 이 때, 가장 큰 singular value 하나만 택하고, 그에 대응하는 U,Σ,V의 부분 행렬을 이용해서 A을 만들면 만들 수 있는 rank1 행렬 중 원래 행렬인 A와 가장 유사한 행렬을 만들게 되는 것이다.

 

SVD와 PCA?

 PCA라고 하면 공분산 행렬을 기반으로 얻은 고유벡터를 이용해서 차원을 축소하는 방법이라고 알고 있을 것이다. 그런데 이 역시도 SVD와 연결지을 수 있다.

 데이터 행렬 D가 존재한다고 할 때, 공분산 행렬은 다음과 같이 구할 수 있다. X = D - mean(D) 라고 하면 XTX가 공분산 행렬이 된다. 앞서 언급했듯이 XTX를 고윳값 분해해보면 VΛV1이 되고, XTX는 대칭 행렬이므로 V는 orthogonal 행렬이다. 즉 VT=V1 라는 것이므로 VΛVT 라고 표현할 수 있으며 SVD 분해라고 볼 수도 있다.

 PCA에서는 고윳값이 큰 고유 벡터 순서대로 정렬하므로 SVD에서도 마찬가지로 singular value가 큰 순서대로 정렬하면 된다. 따라서 SVD에서 UΣ의 각 열벡터는 주성분이라고 볼 수 있다.