🖥️ 컴퓨터 싸이언스

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

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

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

 

고윳값 분해 (Eigenvalue Decomposition)

고윳값과 고유벡터

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

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

 

고윳값 분해 정의

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

$$A = V \Lambda V^{-1}$$

 

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

 

기하학적 의미

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

 

대칭 행렬의 고윳값 분해

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

$$A = V \Lambda V^{-1} = A^T = (V \Lambda V^{-1})^T = (V^{-1})^T \Lambda^T V^T$$

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

$$V \Lambda V^{-1} = (V^{-1})^T \Lambda V^T$$

 따라서, $V$는 $V^T = V^{-1}$를 만족하는 직교행렬임을 알 수 있다.

 

특이값 분해 (Singluar Value Decomposition)

특이값 분해 정의

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

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

$$A = U \Sigma V^T$$

  • $A$는 분해하려고 하는 행렬로 m x n 크기의 행렬이다.
  • $U$는 m x m 크기의 orthogonal 행렬로, $U^T U = UU^T = I$이고 $U^{-1} = U^T$를 만족한다.
  • $\Sigma$는 m x n 크기의 대각행렬이다.
  • $V$는 n x n 크기의 orthogonal한 행렬이다.

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

 

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

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

$$AA^T = U \Sigma V^T (U \Sigma V^T)^T$$

$$= U \Sigma V^T V \Sigma^T U^T$$

$$= U (\Sigma \Sigma^T) U^T$$

 위의 식은 $AA^T$를 고윳값 분해한 것이라고 볼 수 있다. $U$는 $AA^T$의 고유벡터들로 구성된 행렬이 된다. 마찬가지로 $A^T A$에 대해서 풀어보면, $V$는 $A^T A$의 고유벡터들로 구성된 행렬이라고 볼 수있다.

 

차원 축소와 SVD?

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

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, \Sigma, V$의 부분 행렬을 이용해서 $A^{\prime}$을 만들면 만들 수 있는 rank1 행렬 중 원래 행렬인 $A$와 가장 유사한 행렬을 만들게 되는 것이다.

 

SVD와 PCA?

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

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

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