SciPy 고유값과 고유벡터 구하기 (eig)
1. 개요
선형 대수학에서 고유값(Eigenvalue)과 고유벡터(Eigenvector)는 행렬의 성질을 이해하는 데 중요한 개념입니다. 고유값과 고유벡터는 행렬의 변환 특성을 분석하고, 데이터 분석, 물리학, 통계학, 신호 처리, 기계 학습 등 다양한 분야에서 활용됩니다. Python의 SciPy 라이브러리에서는 scipy.linalg.eig 함수를 통해 손쉽게 고유값과 고유벡터를 구할 수 있습니다.
이 글에서는 다음과 같은 내용을 다룹니다.
- 고유값과 고유벡터의 정의
scipy.linalg.eig함수의 사용법- 실전 예제와 해석
- 복소수 행렬의 고유값과 고유벡터
- 실전 활용 사례
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)
반환값은 다음과 같습니다.
- 고유값: 복소수 형태의 ndarray, 행렬의 고유값
- 고유벡터: 복소수 형태의 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. 실전 활용 사례
고유값과 고유벡터는 다음과 같은 분야에서 활용됩니다.
- 주성분 분석(PCA): 데이터의 주된 방향을 찾는 데 사용됩니다.
- 진동 해석: 구조물의 고유 진동수를 분석하는 데 활용됩니다.
- 그래프 이론: 그래프 라플라시안 행렬의 스펙트럼 분석에 사용됩니다.
- 양자 역학: 해밀토니안 행렬의 스펙트럼을 분석하는 데 활용됩니다.
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 함수를 활용하여 행렬의 고유값과 고유벡터를 구하는 방법을 살펴보았습니다. 이러한 개념은 데이터 분석, 신호 처리, 머신 러닝, 그래프 분석 등 다양한 분야에서 널리 사용됩니다.
정리하면 다음과 같습니다.
- 고유값과 고유벡터는 행렬의 선형 변환 특성을 분석하는 데 사용된다.
scipy.linalg.eig함수를 이용하면 쉽게 고유값과 고유벡터를 구할 수 있다.- 실수와 복소수 행렬 모두에 대해 적용 가능하다.
- 주성분 분석(PCA)과 같은 실제 문제에도 활용할 수 있다.
'Python > SciPy' 카테고리의 다른 글
| SciPy를 활용한 행렬식과 역행렬 계산 (0) | 2025.11.21 |
|---|---|
| SciPy 행렬 연산과 특이값 분해 (SVD) (0) | 2025.11.19 |
| SciPy 선형 방정식 풀기 (solve) (0) | 2025.11.18 |
| SciPy 모듈 구조 소개 (linalg, optimize, stats 등) (0) | 2025.11.17 |
| SciPy와 NumPy의 관계 – 차이와 상호 작용 (0) | 2025.11.16 |