Python/SciPy

SciPy 고유값과 고유벡터 구하기 (eig)

임베디드 친구 2025. 11. 20. 20:37
728x90
반응형

SciPy 고유값과 고유벡터 구하기 (eig)

1. 개요

선형 대수학에서 고유값(Eigenvalue)과 고유벡터(Eigenvector)는 행렬의 성질을 이해하는 데 중요한 개념입니다. 고유값과 고유벡터는 행렬의 변환 특성을 분석하고, 데이터 분석, 물리학, 통계학, 신호 처리, 기계 학습 등 다양한 분야에서 활용됩니다. Python의 SciPy 라이브러리에서는 scipy.linalg.eig 함수를 통해 손쉽게 고유값과 고유벡터를 구할 수 있습니다.

이 글에서는 다음과 같은 내용을 다룹니다.

  1. 고유값과 고유벡터의 정의
  2. scipy.linalg.eig 함수의 사용법
  3. 실전 예제와 해석
  4. 복소수 행렬의 고유값과 고유벡터
  5. 실전 활용 사례

2. 고유값과 고유벡터의 정의

정사각 행렬 $ A $와 그에 대응하는 벡터 $ \mathbf{v} $가 주어졌을 때, 다음과 같은 관계식을 만족하는 $ \lambda $를 고유값이라 하고, $ \mathbf{v} $를 고유벡터라고 합니다.

$$
A \mathbf{v} = \lambda \mathbf{v}
$$

여기서

  • $ A $: 정사각 행렬
  • $ \lambda $: 고유값 (Scalar)
  • $ \mathbf{v} $: 고유벡터 (Vector)

고유벡터는 행렬 $ A $에 의해 방향이 변하지 않는 벡터입니다. 고유값 $ \lambda $는 해당 고유벡터가 얼마나 확대 또는 축소되는지를 나타냅니다.

2.1 예제 행렬과 개념적 설명

다음과 같은 행렬 $ A $를 고려해봅시다.

$$
A = \begin{bmatrix} 4 & 1 \ 2 & 3 \end{bmatrix}
$$

이 행렬의 고유값과 고유벡터를 구하는 과정은 특성 방정식을 푸는 것과 같습니다. 특성 방정식은 다음과 같이 표현됩니다.

$$
\det(A - \lambda I) = 0
$$

이를 해석하면 행렬의 선형 변환에서 변하지 않는 방향과 크기를 분석하는 것입니다.

3. SciPy를 이용한 고유값과 고유벡터 구하기

3.1 scipy.linalg.eig 함수 소개

scipy.linalg.eig 함수는 정사각 행렬의 고유값과 고유벡터를 구하는 데 사용됩니다. 기본적인 사용법은 다음과 같습니다.

import numpy as np
from scipy.linalg import eig

# 예제 행렬
A = np.array([[4, 1],
              [2, 3]])

# 고유값과 고유벡터 구하기
eigenvalues, eigenvectors = eig(A)

print("고유값:", eigenvalues)
print("고유벡터:\n", eigenvectors)

3.2 함수 설명

scipy.linalg.eig 함수는 다음과 같은 인수를 받습니다.

  • a: 고유값과 고유벡터를 구할 정사각 행렬
  • left (옵션): 왼쪽 고유벡터를 구할지 여부 (기본값은 False)
  • right (옵션): 오른쪽 고유벡터를 구할지 여부 (기본값은 True)

반환값은 다음과 같습니다.

  1. 고유값: 복소수 형태의 ndarray, 행렬의 고유값
  2. 고유벡터: 복소수 형태의 ndarray, 대응하는 고유벡터

4. 실전 예제와 해석

다음은 실제로 고유값과 고유벡터를 구하고 해석하는 과정입니다.

import numpy as np
from scipy.linalg import eig

# 2x2 행렬 정의
A = np.array([[4, 1],
              [2, 3]])

# 고유값과 고유벡터 구하기
eigenvalues, eigenvectors = eig(A)

# 결과 출력
print("고유값:")
print(eigenvalues)

print("\n고유벡터:")
print(eigenvectors)

출력 결과는 다음과 같습니다.

고유값:
[5.+0.j 2.+0.j]

고유벡터:
[[ 0.70710678 -0.4472136 ]
 [ 0.70710678  0.89442719]]

4.1 결과 해석

  • 고유값: 5와 2는 행렬 $ A $의 고유값을 나타냅니다.
  • 고유벡터: 각 열 벡터는 해당 고유값에 대응하는 고유벡터입니다.

첫 번째 고유값 5에 대응하는 고유벡터는 $ [0.707, 0.707] $이며, 두 번째 고유값 2에 대응하는 고유벡터는 $ [-0.447, 0.894] $입니다.

5. 복소수 행렬의 고유값과 고유벡터

복소수 요소를 가진 행렬의 고유값과 고유벡터도 scipy.linalg.eig를 통해 쉽게 구할 수 있습니다.

# 복소수 행렬 정의
B = np.array([[2, -1j],
              [1j, 3]])

# 고유값과 고유벡터 구하기
eigenvalues, eigenvectors = eig(B)

print("고유값:", eigenvalues)
print("고유벡터:\n", eigenvectors)

출력 결과는 다음과 같이 나옵니다.

고유값: [3.30277564+0.j 1.69722436+0.j]

고유벡터:
[[ 0.70710678+0.j         -0.70710678+0.j        ]
 [ 0.        +0.70710678j  0.        -0.70710678j]]

복소수 행렬의 고유값과 고유벡터 역시 실수 및 허수 부분으로 나타나며, 방향과 크기를 분석하는 데 사용됩니다.

6. 실전 활용 사례

고유값과 고유벡터는 다음과 같은 분야에서 활용됩니다.

  1. 주성분 분석(PCA): 데이터의 주된 방향을 찾는 데 사용됩니다.
  2. 진동 해석: 구조물의 고유 진동수를 분석하는 데 활용됩니다.
  3. 그래프 이론: 그래프 라플라시안 행렬의 스펙트럼 분석에 사용됩니다.
  4. 양자 역학: 해밀토니안 행렬의 스펙트럼을 분석하는 데 활용됩니다.

6.1 주성분 분석(PCA) 예제

아래는 2차원 데이터에 대해 PCA를 수행하여 주성분을 찾는 과정입니다.

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 샘플 데이터 생성
data = np.array([[2, 3], [3, 3], [3, 4], [5, 6], [7, 8], [9, 10]])

# PCA 적용
pca = PCA(n_components=2)
pca.fit(data)

# 고유값과 고유벡터 출력
print("PCA 고유값:", pca.explained_variance_)
print("PCA 고유벡터:")
print(pca.components_)

이 결과는 데이터의 분산을 가장 잘 설명하는 방향과 크기를 보여줍니다.

7. 결론

이 글에서는 SciPy의 scipy.linalg.eig 함수를 활용하여 행렬의 고유값과 고유벡터를 구하는 방법을 살펴보았습니다. 이러한 개념은 데이터 분석, 신호 처리, 머신 러닝, 그래프 분석 등 다양한 분야에서 널리 사용됩니다.

정리하면 다음과 같습니다.

  1. 고유값과 고유벡터는 행렬의 선형 변환 특성을 분석하는 데 사용된다.
  2. scipy.linalg.eig 함수를 이용하면 쉽게 고유값과 고유벡터를 구할 수 있다.
  3. 실수와 복소수 행렬 모두에 대해 적용 가능하다.
  4. 주성분 분석(PCA)과 같은 실제 문제에도 활용할 수 있다.
반응형