[Linear algebra] 3.3 eigenvalue decomposition (2)

JKH·약 13시간 전
0

선형대수

목록 보기
9/12

대각화

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

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

λ1,λ2,,λN      v1,v2,,vN(3.3.49)\lambda_1, \lambda_2, \cdots, \lambda_N \;\;\; v_1, v_2, \cdots, v_N \tag{3.3.49}

이라고 하자.

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

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

V=[v1vN](3.3.50)V = \left[ v_1 \cdots v_N \right] \tag{3.3.50}
VRN×N(3.3.51)V \in \mathbf{R}^{N \times N} \tag{3.3.51}

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

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

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

AV=A[v1vN]=[Av1AvN]=[λ1v1λNvN]=[v1vN][λ1000λ2000λN]=VΛ(3.3.54)\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} \tag{3.3.54}
AV=VΛ(3.3.55)AV = V\Lambda \tag{3.3.55}

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

A=VΛV1(3.3.56)A = V \Lambda V^{-1} \tag{3.3.56}

예제

위에서 예로 든 행렬 BB를 대각화하면 다음과 같다.

V=[3131221312](3.3.57)V = \begin{bmatrix} \dfrac{3}{\sqrt{13}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{2}{\sqrt{13}} & \dfrac{1}{\sqrt{2}} \end{bmatrix} \tag{3.3.57}
Λ=[4001](3.3.58)\Lambda = \begin{bmatrix} 4 & 0 \\ 0 & -1 \end{bmatrix} \tag{3.3.58}
V1=15[13132232](3.3.59)V^{-1} = \dfrac{1}{5} \begin{bmatrix} \sqrt{13} & \sqrt{13} \\ -2\sqrt{2} & 3\sqrt{2} \end{bmatrix} \tag{3.3.59}
B=[2321]=VΛV1=15[3131221312][4001][13132232](3.3.60)B= \begin{bmatrix} 2 & 3 \\ 2 & 1 \end{bmatrix} = V\Lambda V^{-1} = \dfrac{1}{5} \begin{bmatrix} \dfrac{3}{\sqrt{13}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{2}{\sqrt{13}} & \dfrac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix} 4 & 0 \\ 0 & -1 \end{bmatrix} \begin{bmatrix} \sqrt{13} & \sqrt{13} \\ -2\sqrt{2} & 3\sqrt{2} \end{bmatrix} \tag{3.3.60}

NumPy을 이용하여 위 식을 계산하면 좌변과 우변이 같음을 확인할 수 있다.

V2
array([[ 0.83205029, -0.70710678],
       [ 0.5547002 ,  0.70710678]])
V2_inv = np.linalg.inv(V2)
V2_inv
array([[ 0.72111026,  0.72111026],
       [-0.56568542,  0.84852814]])
V2 @ np.diag(w2) @ V2_inv
array([[2., 3.],
       [2., 1.]])

연습 문제 3.3.6

다음 행렬을 고윳값과 고유벡터로 대각화하라.

[2321](3.3.61)\begin{bmatrix} 2 & 3 \\ 2 & 1 \end{bmatrix} \tag{3.3.61}

✒️

import numpy as np
a = np.array([[2, 3], [2, 1]])
w, V = np.linalg.eig(a)
lamb = np.diag(w)
a_diag = V @ lamb @ np.linalg.inv(V)
print(a, a_diag)
[[2 3] [2 1]] 
[[2. 3.] [2. 1.]]

연습 문제 3.3.7

다음 행렬은 고윳값과 고유벡터로 대각화 가능한가?

[1101](3.3.62)\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \tag{3.3.62}

✒️
고유벡터로 만든 행렬이 역행렬을 갖지 않아서 불가능하다.

대각화가능

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

고윳값과 역행렬

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

이는 다음과 같이 증명할 수 있다.

행렬 AA가 대각화가능하면 다음처럼 표현할 수 있다.

A=VΛV1(3.3.63)A = V\Lambda V^{-1} \tag{3.3.63}

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

A1=(VΛV1)1=VΛ1V1(3.3.64)A^{-1} = (V\Lambda V^{-1})^{-1} = V \Lambda^{-1} V^{-1} \tag{3.3.64}

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

✒️
대각화를 통해 행렬곱으로 표현한 뒤 양변에 det를 적용하면 행렬곱의 det는 각 행렬의 det의 곱이므로 det(A) = det(V)det(Λ)det(V1)det(V)det(\Lambda)det( V^{-1} ) 에서 모든 고윳값이 0이 아니면 이 식도 0이 아니고 따라서 역행렬이 존재한다.

✒️참조

  • det(대각행렬) = 대각 성분들의 곱
  • 고윳값들의 곱 = det

연습 문제 3.3.8

[2321](3.3.65)\begin{bmatrix} 2 & 3 \\ 2 & 1 \end{bmatrix} \tag{3.3.65}

의 고윳값과 고유벡터는 다음과 같다. 이 정보를 이용하여 역행렬을 계산하라.

λ1=4,    v1=[313213](3.3.66)\lambda_1 = 4, \;\; v_1 = \begin{bmatrix} \dfrac{3}{\sqrt{13}} \\ \dfrac{2}{\sqrt{13}} \end{bmatrix} \tag{3.3.66}
λ2=1,    v2=[1212](3.3.67)\lambda_2 = -1, \;\; v_2 = \begin{bmatrix} -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} \end{bmatrix} \tag{3.3.67}

✒️
고유벡터들이 선형독립인가?
yes -> 대각화 가능

고윳값이 모두 0이 아닌 값인가?
yes -> 역행렬 존재

A=VΛV1A = V\Lambda V^{-1} 이므로 A1=VΛ1V1A^{-1} = V\Lambda^{-1} V^{-1}

import numpy as np
v = np.array([[3/np.sqrt(13), -1/np.sqrt(2)], [2/np.sqrt(13), 1/np.sqrt(2)]])
w = np.array([4, -1])
print(v @ np.linalg.inv(np.diag(w)) @ np.linalg.inv(v))
[[-0.25 0.75] 
[ 0.5 -0.5 ]]

역행렬 공식대로 구해보면 동일하다

대칭행렬의 고유분해

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

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

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

VTV=VVT=I(3.3.68)V^T V = V V^T = I \tag{3.3.68}
V1=VT(3.3.69)V^{-1} = V^T \tag{3.3.69}

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

A=VΛVT(3.3.70)A = V\Lambda V^T \tag{3.3.70}

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

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

대칭행렬을 랭크-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](3.3.71)\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} \tag{3.3.71}

따라서 NN차원 대칭행렬 AA

A=i=1NλiviviT=i=1NλiAi=λ1A1++λNAN(3.3.72)A = \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 \tag{3.3.72}

예제

대칭행렬

[603020302015201512](3.3.73)\begin{bmatrix} 60 & 30 & 20 \\ 30 & 20 & 15 \\ 20 & 15 & 12 \\ \end{bmatrix} \tag{3.3.73}

를 NumPy를 사용하여 다음처럼 세 개의 랭크-1 행렬로 나눌 수 있다.

A = np.array([[60., 30., 20.],
              [30., 20., 15.],
              [20., 15., 12.]])

w, V = np.linalg.eig(A)
w1, w2, w3 = w
v1 = V[:, 0:1]
v2 = V[:, 1:2]
v3 = V[:, 2:3]
A1 = v1 @ v1.T
A2 = v2 @ v2.T
A3 = v3 @ v3.T
w
array([84.49913563,  7.33962395,  0.16124042])
w1 * A1
array([[57.79768857, 32.13739648, 22.59357583],
       [32.13739648, 17.8694387 , 12.56276371],
       [22.59357583, 12.56276371,  8.83200836]])
w2 * A2
array([[ 2.19968372, -2.12270483, -2.60775134],
       [-2.12270483,  2.04841985,  2.51649195],
       [-2.60775134,  2.51649195,  3.09152039]])
w3 * A3
array([[ 0.00262772, -0.01469165,  0.01417551],
       [-0.01469165,  0.08214145, -0.07925566],
       [ 0.01417551, -0.07925566,  0.07647125]])
w1 * A1 + w2 * A2 + w3 * A3
array([[60., 30., 20.],
       [30., 20., 15.],
       [20., 15., 12.]])

만약 0인 고윳값이 없다면 역행렬도 다음처럼 NN개의 랭크-1 행렬 Ai=viviTA_i = v_i v_i^T 의 합으로 표시할 수 있다.

A1=VΛ1VT=i=1N1λiviviT=1λ1A1++1λNAN(3.3.74)A^{-1} = V \Lambda^{-1} V^T = \sum_{i=1}^{N} \dfrac{1}{\lambda_i} v_i v_i^T = \dfrac{1}{\lambda_1} A_1 + \cdots + \dfrac{1}{\lambda_N} A_N \tag{3.3.74}

앞에서 예로 든 대칭행렬의 역행렬도 다음처럼 랭크-1 행렬의 합으로 나타난다.

np.linalg.inv(A)
array([[ 0.15, -0.6 ,  0.5 ],
       [-0.6 ,  3.2 , -3.  ],
       [ 0.5 , -3.  ,  3.  ]])
1 / w1 * A1
array([[0.0080948 , 0.00450097, 0.00316432],
       [0.00450097, 0.00250269, 0.00175947],
       [0.00316432, 0.00175947, 0.00123696]])
1 / w2 * A2
array([[ 0.04083313, -0.03940415, -0.04840816],
       [-0.03940415,  0.03802519,  0.04671409],
       [-0.04840816,  0.04671409,  0.05738845]])
1 / w3 * A3
array([[ 0.10107208, -0.56509682,  0.54524384],
       [-0.56509682,  3.15947213, -3.04847356],
       [ 0.54524384, -3.04847356,  2.94137459]])
1 / w1 * A1 + 1 / w2 * A2 + 1 / w3 * A3
array([[ 0.15, -0.6 ,  0.5 ],
       [-0.6 ,  3.2 , -3.  ],
       [ 0.5 , -3.  ,  3.  ]])

대칭행렬의 고윳값 부호

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

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

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

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

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

A=i=1NλiviviT(3.3.75)A = \sum_{i=1}^{N} {\lambda_i} v_i v_i^T \tag{3.3.75}

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

vjTAvj>0(3.3.76)v_j^TAv_j > 0 \tag{3.3.76}

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

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

따라서

vjTAvj=vjT(i=1NλiviviT)vj=i=1NλivjTviviTvj=λj>0(3.3.79)v_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 \tag{3.3.79}

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

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

xTAix=xTviviTx=(xTvi)(xTvi)T=(xTvi)(xTvi)=xTvi20(3.3.80)x^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 \tag{3.3.80}

이 식에서 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(3.3.81)\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} \tag{3.3.81}

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

분산행렬

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

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

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

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

xT(XTX)x=(Xx)T(Xx)=uTu0(3.3.82)x^T(X^TX)x = (Xx)^T(Xx) = u^Tu \geq 0 \tag{3.3.82}

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

연습 문제 3.3.9

(1) 붓꽃(Iris) 특징데이터 행렬 XX의 분산행렬을 구하고 이 분산행렬의 고윳값들을 구하라.
✒️

from sklearn.datasets import load_iris
X = load_iris().data
X_scatter = X.T @ X
W, V = np.linalg.eig(X_scatter)
print(W)
[9.20830507e+03 3.15454317e+02 1.19780429e+01 3.55257020e+00]

(2) 보스턴 집값(Boston House Price) 특징데이터 행렬 XX의 분산행렬을 구하고 이 분산행렬의 고윳값들을 구하라.
✒️

import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
X = data
X_scatter = X.T @ X
W, V = np.linalg.eig(X_scatter)
print(W)
[1.58386796e+08 1.18747372e+07 4.17002244e+05
1.61644573e+05 2.52697480e+04 1.47629635e+04 
8.18396001e+03 6.07326738e+03 4.23577535e+03 
6.06399504e+02 3.27412564e+02 3.04157837e+01 
2.19326965e+00]

분산행렬의 역행렬

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

[정리] 행렬 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>0(3.3.83)v^T(X^TX)v = (Xv)^T(Xv) = u^Tu > 0 \tag{3.3.83}

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

연습 문제 3.3.10

(1) 양의 정부호인 대칭행렬은 항상 역행렬이 존재하는가?
✒️
그렇다.

(2) 역으로 역행렬이 존재하는 대칭행렬은 항상 양의 정부호인가?
✒️
그렇다.

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은 역행렬이 존재한다.

profile
Connecting my favorite things

0개의 댓글