NumPy로 배우는 선형대수 - 고유값(Eigenvalue)과 고유벡터(Eigenvector)
선형대수는 데이터 과학과 기계 학습에서 필수적인 도구입니다. 특히, 고유값(eigenvalue)과 고유벡터(eigenvector)는 데이터 차원 축소, PCA(주성분 분석), 행렬 분해 등 다양한 응용에서 사용됩니다. 이번 포스팅에서는 Python의 NumPy 라이브러리를 사용하여 고유값과 고유벡터를 계산하고, 이를 이해하는 방법을 소개합니다.
1. 고유값과 고유벡터란?
고유값과 고유벡터는 다음과 같은 행렬 방정식을 만족하는 값과 벡터를 의미합니다:
[ A \mathbf{v} = \lambda \mathbf{v} ]
여기서:
- ( A ): 정방 행렬 (n x n)
- ( \mathbf{v} ): 고유벡터
- ( \lambda ): 고유값
쉽게 말해, 고유벡터는 행렬 ( A )에 의해 그 방향이 변하지 않는 벡터이며, 고유값은 그 벡터가 얼마나 스케일링(늘어나거나 줄어듦)되는지를 나타냅니다.
2. NumPy를 사용한 고유값과 고유벡터 계산
NumPy는 고유값과 고유벡터를 계산하기 위한 numpy.linalg.eig
함수를 제공합니다. 다음은 간단한 예제입니다:
import numpy as np
# 예제 행렬 정의
A = np.array([[4, -2],
[1, 1]])
# 고유값과 고유벡터 계산
eigenvalues, eigenvectors = np.linalg.eig(A)
print("고유값:", eigenvalues)
print("고유벡터:")
print(eigenvectors)
출력 결과
고유값: [3. 2.]
고유벡터:
[[ 0.89442719 -0.70710678]
[ 0.4472136 0.70710678]]
해석
위 결과에서:
- 고유값은 3과 2입니다.
- 첫 번째 고유벡터는 ([0.894, 0.447])이고, 이는 고유값 3에 대응됩니다.
- 두 번째 고유벡터는 ([-0.707, 0.707])이고, 이는 고유값 2에 대응됩니다.
3. 고유값과 고유벡터의 확인
NumPy를 사용하면 계산된 고유값과 고유벡터를 쉽게 검증할 수 있습니다. 검증 과정은 다음과 같습니다:
코드 예제
# 첫 번째 고유값과 고유벡터 검증
lambda_1 = eigenvalues[0]
v_1 = eigenvectors[:, 0]
# 행렬 곱과 스칼라 곱 비교
Av = np.dot(A, v_1)
lv = lambda_1 * v_1
print("A * v_1:", Av)
print("lambda_1 * v_1:", lv)
출력 결과
A * v_1: [2.68328157 1.34164079]
lambda_1 * v_1: [2.68328157 1.34164079]
( A \mathbf{v}_1 )과 ( \lambda_1 \mathbf{v}_1 )이 동일함을 확인할 수 있습니다.
4. 응용: 대칭 행렬의 고유값 분해
대칭 행렬(Symmetric Matrix)은 항상 실수 고유값을 가지며, 고유벡터는 서로 직교합니다. 이는 PCA와 같은 차원 축소 기법에서 중요한 성질입니다.
대칭 행렬 예제
# 대칭 행렬 정의
B = np.array([[2, -1, 0],
[-1, 2, -1],
[0, -1, 2]])
# 고유값과 고유벡터 계산
eigenvalues_B, eigenvectors_B = np.linalg.eig(B)
print("고유값:", eigenvalues_B)
print("고유벡터:")
print(eigenvectors_B)
출력 결과
고유값: [3.41421356 2. 0.58578644]
고유벡터:
[[ 0.5 0.70710678 0.5 ]
[-0.70710678 0. 0.70710678]
[ 0.5 -0.70710678 0.5 ]]
고유벡터 정규성 확인
고유벡터는 항상 정규화되어 있어야 합니다. 이를 확인하려면 다음과 같이 작성할 수 있습니다:
for i in range(len(eigenvalues_B)):
norm = np.linalg.norm(eigenvectors_B[:, i])
print(f"고유벡터 {i+1}의 크기: {norm}")
출력 결과
고유벡터 1의 크기: 1.0
고유벡터 2의 크기: 1.0
고유벡터 3의 크기: 1.0
5. 고유값과 고유벡터의 시각화
2차원 예제를 사용하면 고유값과 고유벡터를 시각화할 수 있습니다.
시각화 코드
import matplotlib.pyplot as plt
# 행렬과 고유벡터 정의
A = np.array([[4, -2],
[1, 1]])
eigenvalues, eigenvectors = np.linalg.eig(A)
# 원점과 고유벡터 끝점 계산
origin = np.array([0, 0])
v1 = eigenvectors[:, 0] * eigenvalues[0]
v2 = eigenvectors[:, 1] * eigenvalues[1]
# 벡터 그리기
plt.quiver(*origin, *v1, angles='xy', scale_units='xy', scale=1, color='r', label='고유벡터 1')
plt.quiver(*origin, *v2, angles='xy', scale_units='xy', scale=1, color='b', label='고유벡터 2')
# 그래프 설정
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
plt.legend()
plt.title("고유벡터 시각화")
plt.show()
결과
위 코드는 고유벡터가 행렬에 의해 스케일링된 후의 방향을 시각화합니다. 이를 통해 고유벡터의 방향과 행렬의 특성을 직관적으로 이해할 수 있습니다.
6. 결론
이번 포스팅에서는 NumPy를 사용하여 고유값과 고유벡터를 계산하고, 이를 검증하고 시각화하는 방법을 배웠습니다. 고유값과 고유벡터는 데이터 분석과 기계 학습에서 매우 중요한 역할을 하며, 이를 이해하고 활용하는 것은 데이터 과학자로서 필수적인 기술입니다.
'Python NumPy' 카테고리의 다른 글
NumPy로 배우는 데이터 분석 - 배열 필터링과 수정 (0) | 2025.02.10 |
---|---|
NumPy 데이터 분석 - 조건에 따른 데이터 선택 (Boolean Indexing) (0) | 2025.02.09 |
NumPy 선형대수 기초 - 역행렬, 전치행렬, 행렬식 (0) | 2025.02.07 |
NumPy 선형대수 - 행렬 곱셈 (dot, matmul) (0) | 2025.02.06 |
NumPy로 배우는 선형대수(Linear Algebra) 기초 (0) | 2025.02.05 |