고윳값 분해

Jane의 study note.·2022년 10월 10일
0

선형대수

목록 보기
8/9

고윳값 분해와 다음에 설명할 특잇값 분해는 행렬의 내부 구조를 살펴보거나 행렬을 이용한 연산을 더 효율적으로 할 때 유용하다. 고윳값 분해의 정의를 살펴보고 이와 관련된 다양한 정리도 살펴보자. 고윳값 분해와 관련된 정리는 증명이 복잡하고 이 책의 범위를 넘는 경우가 많으므로 대부분 증명을 생략하도록 하겠다. 하지만 정리 자체는 데이터 분석에서 많이 사용되기 때문에 알아두기 바란다.

1. 고윳값과 고유벡터

정방 행렬 AA에 대해 다음 식을 만족하는 영벡터가 아닌 벡터 vv, 실수 λ\lambda를 찾을 수 있다고 가정하자.

Av=λvAv = \lambda v

위 식을 만족하는 실수 λ\lambda고윳값(eigenvalue), 벡터 vv고유벡터(eigenvector)라고 한다. 고윳값과 고유벡터를 찾는 작업을 고유분해(eigen-decomposition) 또는 고윳값 분해(eigenvalue decomposition)라고 한다.

행렬 AA의 고유벡터는 행렬 AA를 곱해서 변환을 해도 방향이 바뀌지 않는 벡터다. 고윳값은 변환된 고유벡터와 원래 고유벡터의 크기 비율이다.

위 식은 다음처럼 쓸 수도 있다.

Avλv=(AλI)v=0Av - \lambda v = (A - \lambda I) v = 0

어떤 벡터 vv가 고유벡터가 되면 이 벡터에 실수를 곱한 벡터 cvcv,즉 vv와 방향이 같은 벡터는 모두 고유벡터가 된다.

A(cv)=cAv=cλv=λ(cv)A(c v) = c Av = c \lambda v = \lambda (cv)

그래서 보통 고유벡터를 표시할 때는 길이가 1인 단위벡터가 되도록 다음처럼 정규화(normalization)를 한다.

vv\dfrac{v}{\|v\|}

따라서 위 행렬 AA의 고유값-고유벡터는 보통 다음처럼 나타낸다.

λ=1\lambda = -1
v=[2222][0.70710.7071]v = \begin{bmatrix} \dfrac{\sqrt{2}}{2} \\ \dfrac{\sqrt{2}}{2} \end{bmatrix} \approx \begin{bmatrix} 0.7071 \\ 0.7071 \end{bmatrix}

2. 특성방정식

지금까지는 행렬과 그 행렬의 고윳값-고유벡터를 주고 이들이 정말 고윳값-고유벡터인지를 계산으로 증명했다. 그러면 행렬만 주어졌을 대 고윳값-고유벡터는 어떻게 구할 수 있을까?

행렬 AA의 고유값은 AλIA - \lambda I의 행렬식이 0이 되도록 하는 특성방정식(characteristic equation)의 해를 구하면 된다.

det(AλI)=0\det \left( A - \lambda I \right) = 0

이 조건은 행렬 AλIA - \lambda I가 역행렬이 존재하지 않는다는 뜻이다. 만약 AλIA - \lambda I의 역행렬이 존재한다면 고윳값 조건을 만족하는 벡터가 항상 영벡터가 되기 때문이다.

(AλI)1(AλI)v=0        v=0(A - \lambda I)^{-1}(A - \lambda I)v = 0 \;\; \rightarrow \;\; v = 0

3. 고윳값의 개수

NN차방정식이 항상 NN개의 복소수 해를 가진다는 사실을 이용하면 NN차원 정방행렬의 고윳값의 개수에 대해 다음 정리가 성립한다.

[정리] 중복된 고윳값을 각각 별개로 생각하고 복소수인 고윳값도 고려한다면 NN차원 정방행렬의 고윳값은 항상 NN개다.

4. 고윳값과 대각합/행렬식

어떤 행렬의 고윳값이 λ1,λ2,,λN\lambda_1, \lambda_2, \cdots, \lambda_N이라고 하면 모든 고윳값의 곱은 행렬식의 값과 같고 모든 고윳값의 합은 대각합(trace)의 값과 같다.

det(A)=i=1Nλi\det(A)=\prod_{i=1}^N \lambda_i
tr(A)=i=1Nλi\text{tr}(A) =\sum_{i=1}^N \lambda_i

5. 고유벡터의 계산

고윳값을 알면 다음 연립 방정식을 풀어 고유벡터를 구할 수 있다.

(AλI)v=0(A - \lambda I)v = 0

6. 넘파이를 사용한 고유분해

넘파이의 linalg 서브패키지에서는 고윳값과 고유벡터를 구할 수 있는 eig() 명령을 제공한다.
고윳값은 벡터의 형태로, 고유벡터는 고유벡터 행렬의 형태로 묶여서 나오고 고유벡터는 크기가 1인 단위벡터로 정규화가 되어 있다. 실수인 고윳값이 존재하지 않는 행렬에 대해서는 복소수인 고윳값과 고유벡터를 계산한다.

eig() 명령의 결과로 나오는 고유벡터 행렬은 행이 아니라 열을 고유벡터로 가진다는 점에 주의한다. 수치계산의 오류로 인해 중복되는 고윳값이 미세하게 다른 값으로 계산될 수도 있다.

A = np.array([[1, -2], [2, -3]])
w1, V1 = np.linalg.eig(A)

print(w1)
print(V1)

[-0.99999998 -1.00000002]
[[0.70710678 0.70710678]
 [0.70710678 0.70710678]]

7. 대각화

NN 차원의 정방 행렬 AANN개의 복소수 고윳값과 이에 대응하는 고유벡터를 가진다는 성질을 이용하면 다음처럼 행렬을 분해할 수 있다.

행렬 AA의 고윳값과 이에 대응하는 단위벡터인 고유벡터를 각각

λ1,λ2,,λN      v1,v2,,vN\lambda_1, \lambda_2, \cdots, \lambda_N \;\;\; v_1, v_2, \cdots, v_N

이라고 하자.

이 고윳값과 고유벡터를 묶어서 다음과 같이 고유벡터행렬, 고윳값행렬을 정의할 수 있다.

고유벡터행렬 VV은 고유벡터를 열벡터로 옆으로 쌓아서 만든 행렬이다.

V=[v1vN]V = \left[ v_1 \cdots v_N \right]
VRN×NV \in \mathbf{R}^{N \times N}

고윳값행렬 Λ\Lambda은 고윳값을 대각성분으로 가지는 대각행렬이다.

Λ=[λ1000λ2000λN]\Lambda = \begin{bmatrix} \lambda_{1} & 0 & \cdots & 0 \\ 0 & \lambda_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_{N} \\ \end{bmatrix}
ΛRN×N\Lambda \in \mathbf{R}^{N \times N}

위와 같이 고유벡터행렬과 고윳값행렬을 정의하면 행렬과 고유벡터행렬의 곱은 고유벡터행렬과 고윳값행렬의 곱과 같다.

AV=A[v1vN]=[Av1AvN]=[λ1v1λNvN]=[v1vN][λ1000λ2000λN]=VΛ\begin{aligned} AV &= A \left[ v_1 \cdots v_N \right] \\ &= \left[ A v_1 \cdots A v_N \right] \\ &= \left[ \lambda_1 v_1 \cdots \lambda_N v_N \right] \\ &= \left[ v_1 \cdots v_N \right] \begin{bmatrix} \lambda_{1} & 0 & \cdots & 0 \\ 0 & \lambda_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_{N} \\ \end{bmatrix} \\ &= V\Lambda \end{aligned}

즉,

AV=VΛAV = V\Lambda

만약 고유벡터행렬 VV의 역행렬이 존재한다면 행렬을 다음처럼 고유벡터행렬과 고윳값행렬의 곱으로 표현할 수 있다. 이를 행렬의 대각화(diagonalization)라고 한다.

A=VΛV1A = V \Lambda V^{-1}

8. 대각화 가능

[정리] 행렬이 대각화가능하려면 고유벡터가 선형독립이어야 한다.

행렬을 대각화할 수 있으면 대각화가능(diagonalizable) 행렬이라고 한다. 앞서 이야기했듯이 고유벡터인 열벡터로 이루어진 행렬에 역행렬이 존재하면 대각화가능이라고 했다. 그런데 앞절에서 정방행렬의 역행렬이 존재할 조건은 정방행렬의 열벡터 즉, 고유벡터들이 선형독립인 경우이다. 따라서 행렬이 대각화가능하려면 고유벡터가 선형독립이어야한다.

9. 고윳값과 역행렬

[정리] 대각화가능한 행렬에 0인 고유값이 없으면 항상 역행렬이 존재한다.

이는 다음과 같이 증명할 수 있다.
행렬 AA가 대각화가능하면 다음처럼 표현할 수 있다.

A=VΛV1A = V\Lambda V^{-1}

이 행렬의 역행렬은 다음처럼 계산한다.

A1=(VΛV1)1=VΛ1V1A^{-1} = (V\Lambda V^{-1})^{-1} = V \Lambda^{-1} V^{-1}

대각행렬의 역행렬은 각 대각성분의 역수로 이루어진 대각행렬이므로 0인 고유값만 없으면 항상 역행렬이 존재한다.

10. 대칭행렬의 고유분해

대칭행렬에 대해서는 다음 정리가 성립한다.

[정리] 행렬 AA가 실수인 대칭행렬이면 고유값이 실수이고 고유벡터는 서로 직교(orthogonal)한다.

만약 고유벡터들이 크기가 1이 되도록 정규화된 상태라면 고유벡터 행렬 VV는 정규직교(orthonormal) 행렬이므로 전치행렬이 역행렬이다.

VTV=VVT=IV^T V = V V^T = I
V1=VTV^{-1} = V^T

따라서 대각화가 가능하고 다음처럼 쓸 수 있다.

A=VΛVTA = V\Lambda V^T

이 사실로부터 다음 정리도 도출된다.

[정리] 실수인 대칭행렬은 항상 대각화가능하다.

11. 대칭행렬을 랭크-1 행렬의 합으로 분해

NN차원 대칭행렬 AA는 다음처럼 NN개의 랭크-1 행렬 Ai=viviTA_i = v_i v_i^T 의 합으로 표시할 수 있다.

A=VΛVT=[v1v2vN][λ1000λ2000λN][v1Tv2TvNT]=[λ1v1λ2v2λNvN][v1Tv2TvNT]\begin{aligned} A &= V\Lambda V^T \\ &= \begin{bmatrix} v_1 & v_2 & \cdots & v_N \end{bmatrix} \begin{bmatrix} \lambda_{1} & 0 & \cdots & 0 \\ 0 & \lambda_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_{N} \\ \end{bmatrix} \begin{bmatrix} v_1^T \\ v_2^T \\ \vdots \\ v_N^T \end{bmatrix} \\ &= \begin{bmatrix} \lambda_{1}v_1 & \lambda_{2}v_2 & \cdots & \lambda_{N}v_N \end{bmatrix} \begin{bmatrix} v_1^T \\ v_2^T \\ \vdots \\ v_N^T \end{bmatrix} \\ \end{aligned}

따라서 NN차원 대칭행렬 AA

A=i=1NλiviviT=i=1NλiAi=λ1A1++λNANA = \sum_{i=1}^{N} {\lambda_i} v_i v_i^T = \sum_{i=1}^{N} {\lambda_i} A_i = \lambda_1 A_1 + \cdots + \lambda_N A_N

12. 대칭행렬의 고윳값 부호

대칭행렬이 위와 같이 랭크-1 행렬의 합으로 표시되고 고유벡터가 서로 직교한다는 성질을 이용하면 다음 정리를 증명할 수 있다.

[정리] 대칭행렬이 양의 정부호(positive definite)이면 고윳값은 모두 양수다. 역도 성립한다.

[정리] 대칭행렬이 양의 준정부호(positive semidefinite)이면 고윳값은 모두 0이거나 양수다. 역도 성립한다.

여기에서는 첫 번째 정리만 증명해보자. 두 번째 정리도 비슷한 방법으로 증명할 수 있다.

대칭행렬은 랭크-1 행렬의 합으로 표시된다고 하였다.

A=i=1NλiviviTA = \sum_{i=1}^{N} {\lambda_i} v_i v_i^T

만약 대칭행렬이 양의 정부호이면 어떤 벡터 xx를 행렬 AA의 앞뒤에 곱해 이차형식을 만들어도 0보다 커야 하므로 jj번째 고유벡터 x=vjx=v_j를 선택하여 곱해도 마찬가지다.

vjTAvj>0v_j^TAv_j > 0

그런데 대칭행렬은 고유벡터들이 서로 직교한다.

viTvj=0  (if ij)v_i^Tv_j = 0 \; (\text{if } i \neq j)
viTvi=1v_i^Tv_i^{} = 1

따라서

vjTAvj=vjT(i=1NλiviviT)vj=i=1NλivjTviviTvj=λj>0v_j^TAv_j = v_j^T \left( \sum_{i=1}^{N} {\lambda_i} v_i v_i^T \right) v_j = \sum_{i=1}^{N} {\lambda_i} v_j^Tv_i v_i^Tv_j = \lambda_j > 0

이므로 양수인 고윳값만 가진다.

반대로 대칭행렬의 고윳값이 모두 양수이면 그 행렬은 양의 정부호가 됨을 증명하자. 우선 고유분해로 만들어진 랭크-1 행렬 Ai=viviTA_i = v_iv_i^T는 양의 준정부호(positive semidefinite)임을 증명할 수 있다.

xTAix=xTviviTx=(xTvi)(xTvi)T=(xTvi)(xTvi)=xTvi20x^T A_i x = x^T v_iv_i^T x = (x^T v_i)(x^T v_i)^T = (x^T v_i)(x^T v_i) = \| x^T v_i \| ^2 \geq 0

이 식에서 xxviv_i와 직교(orthogonal)인 경우에만 0이 된다는 것을 알 수 있다. 고윳값 λi\lambda_i가 모두 양수이므로 따라서 행렬 λiAi\lambda_i A_i를 모두 더한 행렬 λ1A1++λNAN\lambda_1 A_1 + \cdots + \lambda_N A_N도 양의 준정부호다.

xTAx=λ1xTA1x++λNxTANx=λ1xTv12++λNxTvN20\begin{aligned} x^TAx &= \lambda_1 x^TA_1x + \cdots + \lambda_N x^TA_Nx \\ &= \lambda_1 \| x^T v_1 \| ^2 + \cdots + \lambda_N \| x^T v_N \| ^2 \geq 0 \\ \end{aligned}

그런데 이 값은 실제로는 0이 될 수 없다. 왜나하면 이 값이 0이려면 모든 xTvix^T v_i가 0, 다시 말해 xx와 모든 viv_i가 직교해야 하는데 대칭행렬의 고유벡터의 집합은 NN 차원에서 기저벡터를 이루기 때문에 동시에 모든 기저벡터와 직교인 벡터는 존재하지 않기 때문이다. 따라서 양의 정부호다.

13. 분산행렬

임의의 실수 행렬 XX에 대해 XTXX^TX인 정방행렬을 분산행렬(scatter matrix)이라고 한다. 분산행렬의 의미는 확률 분포에서 더 자세하게 공부할 것이다. 일단은 위와 같은 방법으로 계산되는 행렬을 가리키는 명칭이라는 것만 알아두자.

분산행렬에 대해서는 다음 정리가 성립한다.

[정리] 분산행렬은 양의 준정부호(positive semidefinite)이고 고윳값은 0보다 같거나 크다.

임의의 영벡터가 아닌 벡터 xx에 대해 분산행렬에 대한 이차형식을 구하면

xT(XTX)x=(Xx)T(Xx)=uTu0x^T(X^TX)x = (Xx)^T(Xx) = u^Tu \geq 0

로 어떤 벡터 uu의 제곱합이 된다. 따라서 이 값은 0보다 같거나 크고 분산행렬은 양의 준정부호다. 그런데 분산행렬은 대칭행렬이므로 양의준정부호이면 고유값이 모두 0이상이다.

14. 분산행렬의 역행렬

분산행렬에서는 다음 정리가 성립한다.

[정리] 행렬 XRN×M(NM)X\in\mathbf{R}^{N\times M} (N\geq M)가 풀랭크이면 이 행렬의 분산행렬 XTXX^TX의 역행렬이 존재한다.

행렬 XRN×M(NM)X\in\mathbf{R}^{N\times M} (N\geq M)가 풀랭크이면 XX의 열벡터가 기저벡터를 이루기 때문에 영벡터가 아닌 모든 벡터 vv에 대해 Xv=uXv=u는 영벡터가 될 수 없다. (만약 영벡터 uu를 만드는 영벡터가 아닌 vv가 존재한다면 서로 독립이 아니다.) 그러면 XTXX^TX의 이차형식은 항상 양수가 된다.

vT(XTX)v=(Xv)T(Xv)=uTu>0v^T(X^TX)v = (Xv)^T(Xv) = u^Tu > 0

따라서 분산행렬은 양의 정부호이고 역행렬이 존재한다.

15. 요약: 고유분해의 성질

지금까지 나왔던 고유분해와 관련된 정리를 다시 한 번 요약하였다. 이 정리들은 데이터 분석에서 자주 사용되므로 잘 알아두자.

NN차원 정방행렬 AA에 대해

  1. 행렬 AANN개의 고윳값-고유벡터를 가진다(복소수인 경우와 중복인 경우를 포함).
  2. 행렬의 대각합은 모든 고윳값의 합과 같다.
  3. 행렬의 행렬식은 모든 고윳값의 곱과 같다.
  4. 행렬 AA대칭행렬이면 NN개의 실수 고윳값을 가지며 고유벡터들이 서로 직교(orthogonal)이다.
  5. 행렬 AA대칭행렬이고 고윳값이 모두 양수이면 양의 정부호(positive-definite)이고 역행렬이 존재한다. 역도 성립한다.
  6. 행렬 AA가 어떤 행렬 XX분산행렬 XTXX^TX이면 0 또는 양의 고윳값을 가진다.
  7. 행렬 XRN×M(NM)X\in\mathbf{R}^{N\times M} (N\geq M)풀랭크이면 분산행렬 XTXX^TX은 역행렬이 존재한다.

※ 출처

김도형의 데이터 사이언스스쿨 중 3.3 고윳값 분해

0개의 댓글