고유 벡터와 고유값
고유 벡터(Eigenvector)는 어떤 선형 변환을 해도 방향이 변하지 않는 벡터를 뜻한다. 즉, 선형 변환에 의해 크기만 변하고 방향은 그대로 유지되는 벡터이다. 고유 값(Eigenvalue)은 고유 벡터가 선형 변환에 의해 변할 때 어느 정도 변했는지 크기를 나타내는 스칼라 값이다. 즉, 선형 변환을 가했을 때, 벡터가 늘어나거나 줄어드는 정도를 뜻한다.
따라서 행렬 $\mathbf{A}$와 고유 벡터 $\mathbf{v}$와 고유 값 $\lambda$가 있다고 하면 다음과 같은 수식이 성립한다.
$$\mathbf{A} \mathbf{v} = \lambda \mathbf{v}$$
고유값과 고유 벡터 직접 구해보기
이번에는 다음과 같은 행렬에 대한 고유 값과 고유 벡터를 구해보자.
$\mathbf{A} =
\begin{pmatrix}
2 & 1 \\
1 & 2
\end{pmatrix}$
이 행렬에 대한 고유 벡터를 구하기 위해서는 $\mathbf{A} - \lambda \mathbf{I}$ 에 대한 행렬식(Determinant)이 0이 되는 고유값($\lambda$)을 구해야 한다.
$\det(\mathbf{A} - \lambda \mathbf{I}) = 0$
이 값은 다음과 같은 풀이 과정으로 구할 수 있다.
$\begin{vmatrix}
2 - \lambda & 1 \\
1 & 2 - \lambda
\end{vmatrix} = 0$
$(2 - \lambda)(2 - \lambda) - 1 \cdot 1 = 0 \\
\lambda^2 - 4\lambda + 3 = 0 \\
(\lambda - 1)(\lambda - 3) = 0$
그러면 고유값은 1 또는 3이 나오는 것을 볼 수 있다. 이제 각 고유값에 대한 고유 벡터를 구해보자. 풀이 과정은 다음과 같다.
$(\mathbf{A} - 1 \mathbf{I}) \mathbf{v} = 0$
$\begin{pmatrix}
1 & 1 \\
1 & 1
\end{pmatrix}
\begin{pmatrix}
v_1 \\
v_2
\end{pmatrix} = 0$
그러면 고유 벡터($\mathbf{v}$)는 $k\begin{pmatrix} 1\\ -1 \end{pmatrix}$ 가 되는 것을 볼 수 있다.
이걸 정규화 하면 $ \begin{pmatrix} \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} \end{pmatrix}$ 이 된다.
이어서 3에 대해서도 같은 계산을 하면
$(\mathbf{A} - 3 \mathbf{I}) \mathbf{v} = 0$
$\begin{pmatrix}
-1 & 1 \\
1 & -1
\end{pmatrix}
\begin{pmatrix}
v_1 \\
v_2
\end{pmatrix} = 0$
그러면 고유 벡터($\mathbf{v}$)는 $k\begin{pmatrix} 1\\ 1 \end{pmatrix}$ 가 되는 것을 볼 수 있다.
이걸 정규화 하면 $ \begin{pmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{pmatrix}$ 이 된다.
이제 수식으로 구하는 방법은 알았으니 이번에는 파이썬 코드를 통해 구해보자.
고유값과 고유 벡터 파이썬 사용해 구하기
Numpy 사용해 고유값, 고유 벡터 구하기
Numpy를 사용해 고유값과 고유벡터를 구하기 위해서는 linalg.eig 함수를 사용하면 된다.
import numpy as np
# 행렬 정의
A = np.array([[2, 1], [1, 2]])
# 고유 값과 고유 벡터 계산
eigenvalues, eigenvectors = np.linalg.eig(A)
print("고유 값:", eigenvalues)
print("고유 벡터:\n", eigenvectors)
그러면 다음과 같은 결과가 나오는 것을 볼 수 있다.
TensorFlow 사용해 고유값, 고유 벡터 구하기
TensorFlow를 사용해 고유값과 고유벡터를 구하기 위해서는 linalg.eig 함수를 사용하면 된다.
import tensorflow
# 행렬 정의
A = tensorflow.constant([[2, 1], [1, 2]], dtype=tf.float32)
# 고유 값과 고유 벡터 계산
eigenvalues, eigenvectors = tensorflow.linalg.eig(A)
print("고유 벡터:\n", eigenvectors)
그러면 다음과 같은 결과가 나오는 것을 볼 수 있다.
PyTorch 사용해 고유값, 고유 벡터 구하기
PyTorch를 사용해 고유값과 고유벡터를 구하기 위해서는 linalg.eig 함수를 사용하면 된다.
import torch
# 행렬 정의
A = torch.tensor([[2, 1], [1, 2]], dtype=torch.float32)
# 고유 값과 고유 벡터 계산
eigenvalues, eigenvectors = torch.linalg.eig(A)
print("고유 벡터:\n", eigenvectors)
그러면 다음과 같은 결과가 나오는 것을 볼 수 있다.
'Machine Learning Math > Linear Algebra' 카테고리의 다른 글
특이값 분해(Singular Value Decomposition)란 무엇인가? PyTorch, TensorFlow, Numpy 사용해 특이값 분해하기 (0) | 2024.08.16 |
---|---|
고윳값 분해(Eigen Decomposition) 란 무엇인가? Numpy, TensorFlow, PyTorch 사용해 고유값 분해 해보기 (0) | 2024.08.06 |
아핀 변환(Affine Transformation)이란 무엇인가? (0) | 2024.08.01 |
직교 행렬(Orthogonal Matrix)이란 무엇인가? (0) | 2024.07.31 |
대각 행렬(Diagonal Matrix) 한 번에 정리하기 (0) | 2024.07.23 |