NumPy로 배우는 선형대수: 고유값과 고유벡터
선형대수는 데이터 과학과 기계 학습에서 필수적인 도구입니다. 특히, 고유값(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.10.17 |
---|---|
NumPy 데이터 분석: 조건에 따른 데이터 선택 (Boolean Indexing) (0) | 2025.10.16 |
NumPy 선형대수 기초: 역행렬, 전치행렬, 행렬식 (0) | 2025.10.14 |
NumPy 선형대수: 행렬 곱셈 (dot, matmul) (0) | 2025.10.13 |
NumPy로 배우는 선형대수 기초 (0) | 2025.10.12 |