고유값과 고유벡터
정의
기하학적으로 볼 때, 어떤 벡터 $v_{2}$에 행렬 $A$를 곱하면 벡터의 크기와 방향이 변하게 된다. 그런데 어떤 벡터($v_{1})$를 곱했더니 방향이 바뀌지 않고 크기만 변하는 벡터가 존재하더라. 이때의 벡터를 고유벡터라고 하고 그 크기 $\lambda$를 고유값이라고 한다.
$$Av=\lambda v$$
로 식을 작성할 수 있다. (단, $v$는 0이 아니어야 한다.)
하지만 $\lambda$는 스칼라이기 때문에 이대로 계산하지 못한다. 그래서 단위행렬을 곱해서 계산을 진행한다.
$$(A-\lambda I)v=0$$
위 식을 만족시키는 해가 곧 고유벡터이다.
즉, 고유벡터는 고윳값에 의해 이동된 행렬의 영공간에 존재한다.
$v$는 non-trival한 해다.
$(A-\lambda I)v=0$라는 식의 해를 구해야 한다. $Ax=b$에서 $b=0$인 상황이고 homogeneous 시스템이다. 이때, $v$가 0이 아니어야 한다고 가정했으므로 위 식은 non-trivial(자명하지 않은) 해를 가져야만 한다. 동일한 논리로
A는 최대계수(full rank)가 아니어야 한다.
A는 비가역적(noninvertible) 이어야 한다.
$det \;A = 0$이어야 한다.
$$|A- \lambda I|=0$$
위 식을 통해서 우리는 고윳값을 구해낼 수 있다. 위 식은 $\lambda$를 변수로 하는 다항식이 되고 결국 $n$차 방정식의 해를 찾는 과정으로 넘어간다. 이 부분은 아래 특정 방정식 파트에서 자세히 알아보자.
고윳값은 구했다고 치자. 이제 고유벡터를 찾을 차례다.
non-trivial한 해를 가진다는 의미는 행렬이 최대 계수가 아니라는 의미와 동치다.
다시 말해서, free-variable이 존재할 수 밖에 없다.
가우스-조던 소거법을 진행했을 때, 행의 모든 요소가 0인(all-zero row) 가 존재해야 한다.
자명한(trivial) 해가 아니라 자명하지 않은(non-trivial) 해이므로 무수히 많은 해가 존재하고 그 해는 free-variable로 표현될 것이다.
아래 특성 방정식 파트에서 직접 고유값과 고유벡터를 구하는 과정을 보면서 자세히 알아보자.
특성 방정식(Characteristic Equation)
직접 특성 방정식의 해(고윳값)을 구해보자.
$$A=\begin{bmatrix}2&3\\3&-6\end{bmatrix}$$
$$A-\lambda I=\begin{bmatrix}2- \lambda&3\\3&-6-\lambda\end{bmatrix}$$
$$|A-\lambda I|=(2-\lambda)(-6-\lambda)-9=(\lambda-3)(\lambda+7)=0$$
$$\lambda=3,-7$$
$(\lambda -3)(\lambda +7)=0$이라는 특성 방정식을 구했고, 해로 3,-7을 얻었다.
이제 행렬 $A$의 고윳값이 3과 -7임을 알아냈다.
고윳값이 3일 때와 -7일 때의 고유벡터가 다를 것이다.
그래서 각각의 경우에 대해 고유벡터를 구해주어야 한다.
먼저 $\lambda=3$일 때,
$$(A-3I)x=\begin{bmatrix}-1&3 \\ 3&-9\end{bmatrix}\begin{bmatrix}x_1 \\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$$
$$-x_1+3x_2=0,;$$
$$\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}3\\1\end{bmatrix}x_2$$
$\begin{bmatrix}x_1\\x_2\end{bmatrix}$에서 $x_1$을 $3x_2$로 표현할 수 있다. 그래서 해를 $\begin{bmatrix}3\\1\end{bmatrix}x_2$처럼 $x_2$로만 표현할 수 있다.
따라서 고유벡터(eigenvector)는 $\begin{bmatrix}3\\1\end{bmatrix}$이 된다.
다음 $\lambda=-7$일 때, 같은 계산을 진행해준다.
$$\begin{bmatrix}9&3 \\ 3&1\end{bmatrix}\begin{bmatrix}x_1 \\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$$
$$3x_1+x_2=0,;$$
$$\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}1\\-3\end{bmatrix}x_1$$
이므로 고유벡터(eigenvector)는 $\begin{bmatrix}1\\-3\end{bmatrix}$이 된다.
고윳값이 중복되는 경우
$$A=\begin{bmatrix}5&-2&6&-1\\0&3&-8&0 \\0&0&5&4\\0&0&0&1 \end{bmatrix}$$
해당 행렬의 특성 방정식은 $(\lambda-2)^2(\lambda-3)(\lambda-1)=0$이다.
위 식과 같이 특성 방정식을 계산하다 보면 중근이 나오는 경우가 발생한다.
그렇다고 고유벡터를 구하는 데에 문제가 있는 것은 아니다. 똑같은 과정으로 구해주면 된다.
보통 $N \times N$ 행렬에서 $N$개의 서로 다른 고윳값과 $N$개의 서로 선형 독립인 고유벡터가나오지만 이렇게 중근이 나오는 경우에는 고윳값이 1,3,5로 3개만 나올 수 있다. 그럼에도 행렬에 따라 고유벡터가 4개 나올 수도 있다.(위 행렬에서는 고유벡터도 3개다)
관련된 내용은 이후 대각화에서 행렬이 대각화가능(Diagonalizable)인지를 판별할 때 사용된다.
대수적 중복도와 기하학적 중복도
대수적 중복도(Algebraic Multiplicity)
특성 방정식에서 해당 고윳값이 근으로 등장하는 횟수
근의 개수라고 생각하면 쉽다.
위 $4 \times 4$행렬은 고윳값이 1,3,5이고 1과 3은 한 번씩 나오므로 대수적 중복도가 1이다. 반면, 5는 중근이므로 대수적 중복도가 2이다.
기하학적 중복도(Geometric Multiplicity)
특정 고윳값에 해당하는 선형 독립인 고유벡터의 최대 개수
특정 고윳값에 해당하는 고유벡터의 개수이다.
위 $4 \times 4$ 행렬의 고윳값 1,3에 대해서 각각 고유벡터가 1개씩 있으므로 기하학적 중복도는 1이라고 할 수 있다. 5에 대해서도 고유벡터가 1개 있으므로 기하학적 중복도는 1이다.
중복도 간의 관계
두 중복도의 관계는 한 문장으로 표현할 수 있다.
대수적 중복도>=기하학적 중복도
고윳값 5의 대수적 중복도는 2이고 기하학적 중복도는 1이므로 해당 부등식을 만족하는 것을 알 수 있다.
고윳값이 허수인 경우
앞에서 알아본 특정방정식의 해는 모두 실수인 경우였다. 하지만 $n$차 다항식의 해가 꼭 실수라는 법은 없다. 해에 허수가 포함된다면 어떻게 해야 할까?
결론은 다를 바 없다.
A complex scalar $\lambda$ satisfies $det(A-\lambda I)=0$ if and only if there is a nonzero vector $x$ in $C^n$ such that $Ax=\lambda x$. We call $\lambda$ a (complex) eigenvalue and $x$ a (complex) eigenvector corresponding to $\lambda$
정의역을 허수 부분까지 확장해서 실수에서의 조건을 만족시킨다면 고윳값, 고유벡터라고 부를 수 있다는 것이다.
허수 고윳값의 특징
허수 고윳값은 쌍으로 존재한다는 특징이 있다.
복소수에는 켤레복소수라는 개념이 존재한다. 실수 부분과 허수 부분의 값은 같지만 허수 부분의 부호만 다른 복소수 두 개를 켤레복소수 관계에 있다고 한다.
행렬의 모든 요소들이 실수이고 $\lambda$가 행렬 $A$의 고윳값이라고 가정해보자.
$$\overline{Ax}=A\bar{x}=\overline{\lambda x}=\bar{\lambda}\bar{x}$$
$\bar{\lambda}$도 고윳값이고, $\bar{x}$ 역시 고유벡터가 된다는 것을 확인할 수 있다.
아래 예시를 통해서 과정을 살펴보자. 계산과정은 실수 때와 동일하므로 생략했다.
$$A=\begin{bmatrix}0.5&-0.6\\0.75&1.1\end{bmatrix}$$
$$|A-\lambda I|=\lambda^2-1.6\lambda+1=0$$
$$\lambda=0.8\pm0.6i$$
고윳값이 켤레복소수로 나오는 것을 확인할 수 있다.
$\lambda=0.8+0.6i$일 때의 고유벡터는 $\begin{bmatrix}-2+4i\\5\end{bmatrix}$,
$\lambda=0.8-0.6i$일 때의 고유벡터는 $\begin{bmatrix}-2-4i\\5\end{bmatrix}$로 나온다.
고유벡터 역시 켤레복소수로 나오는 것을 알 수 있다.
파이썬으로 구현하기
고윳값 분해 역시 이미 numpy 라이브러리에 구현이 되어 있다.
함수 이름은 numpy.linalg.eig
함수이고 관련된 자세한 내용은 아래 글에 자세하게 작성해놓았다.
https://aaaaaaaaaaayowooji.tistory.com/52
[파이썬 라이브러리]numpy.linalg 함수 분석(2)(qr,eig)
numpy.linalg.qrqr분해는 이미 파이썬 라이브러리에 구현이 되어 있다. numpy.linalg에서 불러오면 된다.linalg.qr(a, mode='reduced')인자(Parameters)a: array_like, shape (…, M, N)QR분해를 할 행렬을 입력한다.최소 2차
aaaaaaaaaaayowooji.tistory.com
수학적으로 정확하게 계산해내기 위해서 입력된 행렬이 정방행렬인지, 고윳값이 허수일 때 등등을 나눠서 구현해야겠지만 편의를 위해 고윳값이 모두 실수일 때만으로 축소시켜 구현했다. 대칭행렬의 고윳값은 항상 실수이므로 고윳값의 범위를 실수로 제한하기 위해 대칭행렬을 만들었다.
알고리즘은 수학적 이론을 바탕으로 그대로 구현했다.
numpy.poly()
함수를 이용해 특성방정식의 계수를 구하고numpy.roots()
함수로 다항식의 근을 구한다. -> 특성방정식의 해(고윳값)을 구했다!- for문을 통해 고윳값마다의 고유벡터를 구한다.
- $A-\lambda I$를 계산하고
scipy.linalg.null_space()
함수를 이용해 영공간을 구해준다.
- $A-\lambda I$를 계산하고
코드
import numpy as np
import scipy.linalg as sig
# 행렬 생성
n = 5
A = np.random.randint(-15, 15, size=(n, n))
A = A.T @ A # 대칭 행렬 생성
# 1. 고윳값 및 고유벡터 계산
eval, evec = np.linalg.eig(A) # numpy로 고윳값과 고유벡터 계산
# 2. 직접 계산
# 2-1. 특성 다항식 -> 고윳값
coeffs = np.poly(A) # 특성 다항식의 계수
evals_1 = np.round(np.roots(coeffs), 6) # 다항식의 근
# 2-2. 고유벡터 계산
evecs_1 = np.zeros((n,n))
for i, _lambda in enumerate(evals_1):
# A - λI 생성
eig_matrix = A - np.eye(n) * _lambda
evecs_1[:,i]= sig.null_space(eig_matrix,rcond=1e-5).reshape(-1,)
#============printing================================
print(f'eig 함수로 구한 eval:\n{np.round(eval, 6)}')
print(f'직접 구한 eval:\n{evals_1}')
print("\neig 함수로 구한 eigenvectors:")
print(np.round(evec, 6))
print("\n직접 구한 eigenvectors:")
print(np.round(evecs_1, 6))
결과
eig 함수로 구한 eval:
[784.901604 625.793453 5.120442 211.955845 106.228656]
직접 구한 eval:
[784.901604 625.793453 211.955845 106.228656 5.120442]
eig 함수로 구한 eigenvectors:
[[-0.098013 -0.242424 -0.853508 -0.43896 0.102286]
[ 0.50593 -0.703723 0.291525 -0.341707 -0.216928]
[-0.047203 -0.515101 -0.272849 0.807445 -0.077649]
[-0.583234 -0.079819 0.066038 -0.139016 -0.793587]
[-0.626129 -0.417497 0.328222 -0.138775 0.553778]]
직접 구한 eigenvectors:
[[-0.098013 0.242424 -0.43896 0.102286 -0.853508]
[ 0.50593 0.703723 -0.341707 -0.216928 0.291525]
[-0.047203 0.515101 0.807445 -0.077649 -0.272849]
[-0.583234 0.079819 -0.139016 -0.793587 0.066038]
[-0.626129 0.417497 -0.138775 0.553778 0.328222]]
출처
서적
개발자를 위한 실전 선형대수학/한빛미디어/마이크,코헨 지음
Linear Algebra and its Application 5th Ed/PEARSON/David C.Lay, Steven R.Lay
WebSite
scipy.linalg.null_space() / official manual
numpy.linalg.eig() / official manual
numpy.linalg.poly)() / official manual
numpy.roots() / official manual
'Linear Algebra > 개발자를 위한 실전 선형대수학' 카테고리의 다른 글
[파이썬과 선형대수] 특잇값 분해의 계층화, Reduced SVD 정의와 직접 구현하기 (0) | 2024.12.18 |
---|---|
[파이썬과 선형대수]특잇값 분해의 정의, svd 안쓰고 직접 구현해보기 (1) | 2024.12.15 |
[파이썬과 선형대수] 일반선형모델(General Linear Model)과 최소제곱해(Least Square Problem) (1) | 2024.11.30 |
[파이썬과 선형대수] LU분해 그리고 직접 구현해보기 (0) | 2024.11.24 |
[파이썬과 선형대수] 기본행렬과 치환행렬 (0) | 2024.11.21 |