Python NumPy

NumPy로 배우는 선형대수 - 고유값(Eigenvalue)과 고유벡터(Eigenvector)

PyExplorer 2025. 2. 8. 10:57
728x90

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를 사용하여 고유값과 고유벡터를 계산하고, 이를 검증하고 시각화하는 방법을 배웠습니다. 고유값과 고유벡터는 데이터 분석과 기계 학습에서 매우 중요한 역할을 하며, 이를 이해하고 활용하는 것은 데이터 과학자로서 필수적인 기술입니다.

728x90