고윳값 분해와 다음에 설명할 특잇값 분해는 행렬의 내부 구조를 살펴보거나 행렬을 이용한 연산을 더 효율적으로 할 때 유용하다. 고윳값 분해의 정의를 살펴보고 이와 관련된 다양한 정리도 살펴보자. 고윳값 분해와 관련된 정리는 증명이 복잡하고 이 책의 범위를 넘는 경우가 많으므로 대부분 증명을 생략하도록 하겠다. 하지만 정리 자체는 데이터 분석에서 많이 사용되기 때문에 알아두기 바란다.
1. 고윳값과 고유벡터
정방 행렬 A에 대해 다음 식을 만족하는 영벡터가 아닌 벡터 v, 실수 λ를 찾을 수 있다고 가정하자.
Av=λv
위 식을 만족하는 실수 λ를 고윳값(eigenvalue), 벡터 v를 고유벡터(eigenvector)라고 한다. 고윳값과 고유벡터를 찾는 작업을 고유분해(eigen-decomposition) 또는 고윳값 분해(eigenvalue decomposition)라고 한다.
행렬 A의 고유벡터는 행렬 A를 곱해서 변환을 해도 방향이 바뀌지 않는 벡터다. 고윳값은 변환된 고유벡터와 원래 고유벡터의 크기 비율이다.
위 식은 다음처럼 쓸 수도 있다.
Av−λv=(A−λI)v=0
어떤 벡터 v가 고유벡터가 되면 이 벡터에 실수를 곱한 벡터 cv,즉 v와 방향이 같은 벡터는 모두 고유벡터가 된다.
A(cv)=cAv=cλv=λ(cv)
그래서 보통 고유벡터를 표시할 때는 길이가 1인 단위벡터가 되도록 다음처럼 정규화(normalization)를 한다.
∥v∥v
따라서 위 행렬 A의 고유값-고유벡터는 보통 다음처럼 나타낸다.
λ=−1
v=⎣⎢⎢⎡2222⎦⎥⎥⎤≈[0.70710.7071]
2. 특성방정식
지금까지는 행렬과 그 행렬의 고윳값-고유벡터를 주고 이들이 정말 고윳값-고유벡터인지를 계산으로 증명했다. 그러면 행렬만 주어졌을 대 고윳값-고유벡터는 어떻게 구할 수 있을까?
행렬 A의 고유값은 A−λI의 행렬식이 0이 되도록 하는 특성방정식(characteristic equation)의 해를 구하면 된다.
det(A−λI)=0
이 조건은 행렬 A−λI가 역행렬이 존재하지 않는다는 뜻이다. 만약 A−λI의 역행렬이 존재한다면 고윳값 조건을 만족하는 벡터가 항상 영벡터가 되기 때문이다.
(A−λI)−1(A−λI)v=0→v=0
3. 고윳값의 개수
N차방정식이 항상 N개의 복소수 해를 가진다는 사실을 이용하면 N차원 정방행렬의 고윳값의 개수에 대해 다음 정리가 성립한다.
[정리] 중복된 고윳값을 각각 별개로 생각하고 복소수인 고윳값도 고려한다면 N차원 정방행렬의 고윳값은 항상 N개다.
4. 고윳값과 대각합/행렬식
어떤 행렬의 고윳값이 λ1,λ2,⋯,λN이라고 하면 모든 고윳값의 곱은 행렬식의 값과 같고 모든 고윳값의 합은 대각합(trace)의 값과 같다.
det(A)=i=1∏Nλi
tr(A)=i=1∑Nλi
5. 고유벡터의 계산
고윳값을 알면 다음 연립 방정식을 풀어 고유벡터를 구할 수 있다.
(A−λ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.707106780.70710678][0.707106780.70710678]]
7. 대각화
N 차원의 정방 행렬 A가 N개의 복소수 고윳값과 이에 대응하는 고유벡터를 가진다는 성질을 이용하면 다음처럼 행렬을 분해할 수 있다.
행렬 A의 고윳값과 이에 대응하는 단위벡터인 고유벡터를 각각
λ1,λ2,⋯,λNv1,v2,⋯,vN
이라고 하자.
이 고윳값과 고유벡터를 묶어서 다음과 같이 고유벡터행렬, 고윳값행렬을 정의할 수 있다.
고유벡터행렬V은 고유벡터를 열벡터로 옆으로 쌓아서 만든 행렬이다.
V=[v1⋯vN]
V∈RN×N
고윳값행렬Λ은 고윳값을 대각성분으로 가지는 대각행렬이다.
Λ=⎣⎢⎢⎢⎢⎡λ10⋮00λ2⋮0⋯⋯⋱⋯00⋮λN⎦⎥⎥⎥⎥⎤
Λ∈RN×N
위와 같이 고유벡터행렬과 고윳값행렬을 정의하면 행렬과 고유벡터행렬의 곱은 고유벡터행렬과 고윳값행렬의 곱과 같다.
만약 고유벡터행렬 V의 역행렬이 존재한다면 행렬을 다음처럼 고유벡터행렬과 고윳값행렬의 곱으로 표현할 수 있다. 이를 행렬의 대각화(diagonalization)라고 한다.
A=VΛV−1
8. 대각화 가능
[정리] 행렬이 대각화가능하려면 고유벡터가 선형독립이어야 한다.
행렬을 대각화할 수 있으면 대각화가능(diagonalizable) 행렬이라고 한다. 앞서 이야기했듯이 고유벡터인 열벡터로 이루어진 행렬에 역행렬이 존재하면 대각화가능이라고 했다. 그런데 앞절에서 정방행렬의 역행렬이 존재할 조건은 정방행렬의 열벡터 즉, 고유벡터들이 선형독립인 경우이다. 따라서 행렬이 대각화가능하려면 고유벡터가 선형독립이어야한다.
9. 고윳값과 역행렬
[정리] 대각화가능한 행렬에 0인 고유값이 없으면 항상 역행렬이 존재한다.
이는 다음과 같이 증명할 수 있다.
행렬 A가 대각화가능하면 다음처럼 표현할 수 있다.
A=VΛV−1
이 행렬의 역행렬은 다음처럼 계산한다.
A−1=(VΛV−1)−1=VΛ−1V−1
대각행렬의 역행렬은 각 대각성분의 역수로 이루어진 대각행렬이므로 0인 고유값만 없으면 항상 역행렬이 존재한다.
10. 대칭행렬의 고유분해
대칭행렬에 대해서는 다음 정리가 성립한다.
[정리] 행렬 A가 실수인 대칭행렬이면 고유값이 실수이고 고유벡터는 서로 직교(orthogonal)한다.
만약 고유벡터들이 크기가 1이 되도록 정규화된 상태라면 고유벡터 행렬 V는 정규직교(orthonormal) 행렬이므로 전치행렬이 역행렬이다.
VTV=VVT=I
V−1=VT
따라서 대각화가 가능하고 다음처럼 쓸 수 있다.
A=VΛVT
이 사실로부터 다음 정리도 도출된다.
[정리] 실수인 대칭행렬은 항상 대각화가능하다.
11. 대칭행렬을 랭크-1 행렬의 합으로 분해
N차원 대칭행렬 A는 다음처럼 N개의 랭크-1 행렬 Ai=viviT 의 합으로 표시할 수 있다.
그런데 이 값은 실제로는 0이 될 수 없다. 왜나하면 이 값이 0이려면 모든 xTvi가 0, 다시 말해 x와 모든 vi가 직교해야 하는데 대칭행렬의 고유벡터의 집합은 N 차원에서 기저벡터를 이루기 때문에 동시에 모든 기저벡터와 직교인 벡터는 존재하지 않기 때문이다. 따라서 양의 정부호다.
13. 분산행렬
임의의 실수 행렬 X에 대해 XTX인 정방행렬을 분산행렬(scatter matrix)이라고 한다. 분산행렬의 의미는 확률 분포에서 더 자세하게 공부할 것이다. 일단은 위와 같은 방법으로 계산되는 행렬을 가리키는 명칭이라는 것만 알아두자.
분산행렬에 대해서는 다음 정리가 성립한다.
[정리] 분산행렬은 양의 준정부호(positive semidefinite)이고 고윳값은 0보다 같거나 크다.
임의의 영벡터가 아닌 벡터 x에 대해 분산행렬에 대한 이차형식을 구하면
xT(XTX)x=(Xx)T(Xx)=uTu≥0
로 어떤 벡터 u의 제곱합이 된다. 따라서 이 값은 0보다 같거나 크고 분산행렬은 양의 준정부호다. 그런데 분산행렬은 대칭행렬이므로 양의준정부호이면 고유값이 모두 0이상이다.
14. 분산행렬의 역행렬
분산행렬에서는 다음 정리가 성립한다.
[정리] 행렬 X∈RN×M(N≥M)가 풀랭크이면 이 행렬의 분산행렬 XTX의 역행렬이 존재한다.
행렬 X∈RN×M(N≥M)가 풀랭크이면 X의 열벡터가 기저벡터를 이루기 때문에 영벡터가 아닌 모든 벡터 v에 대해 Xv=u는 영벡터가 될 수 없다. (만약 영벡터 u를 만드는 영벡터가 아닌 v가 존재한다면 서로 독립이 아니다.) 그러면 XTX의 이차형식은 항상 양수가 된다.
vT(XTX)v=(Xv)T(Xv)=uTu>0
따라서 분산행렬은 양의 정부호이고 역행렬이 존재한다.
15. 요약: 고유분해의 성질
지금까지 나왔던 고유분해와 관련된 정리를 다시 한 번 요약하였다. 이 정리들은 데이터 분석에서 자주 사용되므로 잘 알아두자.
N차원 정방행렬 A에 대해
행렬 A는 N개의 고윳값-고유벡터를 가진다(복소수인 경우와 중복인 경우를 포함).
행렬의 대각합은 모든 고윳값의 합과 같다.
행렬의 행렬식은 모든 고윳값의 곱과 같다.
행렬 A가 대칭행렬이면 N개의 실수 고윳값을 가지며 고유벡터들이 서로 직교(orthogonal)이다.
행렬 A가 대칭행렬이고 고윳값이 모두 양수이면 양의 정부호(positive-definite)이고 역행렬이 존재한다. 역도 성립한다.