본문 바로가기
C.W.K.
Stream
Lesson 07 of 08 · published

고유값과 고유벡터: 변환이 보존하는 방향

~12 min · eigenvalues, eigenvectors, intuition, blender

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

Blender에서 먼저 보기

Blender에서 평면 격자를 만들고 X축 방향으로만 두 배 늘려 봐. X축을 향하던 벡터는 같은 축 위에서 길이만 두 배가 되고, Y축을 향하던 벡터도 같은 축 위에서 길이가 그대로야. 두 방향 모두 변환 뒤에 자기 직선에서 벗어나지 않아.

이처럼 변환이 방향축을 바꾸지 않고 크기와 부호만 바꾸는 0이 아닌 벡터가 고유벡터, 그 배율이 고유값이야. 위 예에서는 X축의 고유값이 2, Y축의 고유값이 1이지.

정의로 묶기

정방행렬 에 대해 0이 아닌 벡터 와 스칼라

를 만족하면 는 고유벡터이고 는 그 고유값이야. 이면 늘어나고, 이면 줄어들어. 이면 같은 직선의 반대 방향으로 뒤집히고, 이면 0벡터로 눌려.

모든 실수 정방행렬이 실수 고유벡터를 충분히 가지는 건 아니야. 회전행렬처럼 실수 공간에서는 고유방향이 없지만 복소수 공간에서는 나타나는 경우도 있고, 고유벡터만으로 대각화할 수 없는 행렬도 있어.

복잡한 변환의 단순한 축

고유벡터가 있으면 그 방향에서는 복잡해 보이는 변환도 스칼라 곱으로 읽을 수 있어. 그래서 반복 변환의 장기 동작이나 데이터가 크게 퍼지는 방향, 그래프의 구조를 분석할 때 유용해.

  • PCA: 중심화한 데이터의 공분산행렬 고유벡터로 분산이 큰 직교 방향을 찾아.
  • PageRank: 전이행렬의 정상분포와 연결되는 고유벡터를 반복 계산해.
  • 양자역학: 에르미트 연산자의 고유값이 가능한 측정 결과와 연결되고 고유벡터가 고유상태를 나타내.
  • 스펙트럴 클러스터링: 그래프 라플라시안의 일부 고유벡터로 그래프를 낮은 차원에 펼쳐 군집을 찾아.
고유벡터는 변환이 같은 직선 위에 남겨 두는 0이 아닌 방향이고, 고유값은 그 방향의 배율이야. 대칭행렬에는 np.linalg.eigh, 일반 정방행렬에는 np.linalg.eig처럼 구조에 맞는 계산을 써.

피파가 붙잡은 한 문장

아빠의 챕터를 여러 번 읽고서야 행렬을 숫자표가 아니라 동사로 보기 시작했어. 고유벡터는 그 동사가 비틀지 않고 배율만 바꾸는 방향이었지. 다만 모든 행렬에 보기 좋은 실수 고유축이 있다는 달콤한 결론까지 덧붙이지 않는 게 진짜 이해더라.

Code

NumPy로 고유값과 고유벡터 구하기·python
import numpy as np

# 대칭 2x2 — 실수 고유값 보장, 수직 고유벡터
A = np.array([[2, 1],
              [1, 2]])

eigenvalues, eigenvectors = np.linalg.eig(A)
print("고유값:", eigenvalues)              # [3. 1.]
print("고유벡터:\n", eigenvectors)
# 각 열이 고유벡터. lambda=3 의 고유벡터 = 대략 (0.707, 0.707) — (1, 1) 방향.
# lambda=1 은 (-0.707, 0.707) — (-1, 1) 방향. 변환이 (1,1) 방향 벡터를 3배,
# (-1,1) 방향 벡터는 그대로.

# 검증: A @ v = lambda * v
v0 = eigenvectors[:, 0]
print(np.allclose(A @ v0, eigenvalues[0] * v0))  # True
MLX의 eigh로 대칭행렬 분석하기·python
import mlx.core as mx

# 대칭행렬에는 일반 eig보다 eigh가 알맞아. 실수 고유값을 반환하고
# 대칭 구조를 활용해. 현재 MLX 릴리스에는 일반 정방행렬용 eig도 있어.
A = mx.array([[2.0, 1.0], [1.0, 2.0]])

eigenvalues, eigenvectors = mx.linalg.eigh(A)
print("고유값:", eigenvalues.tolist())              # [1.0, 3.0]
print("고유벡터:\n", eigenvectors.tolist())
# eigh는 고유값을 오름차순으로 반환하고, 각 열이 대응 고유벡터야.

v_top = eigenvectors[:, -1]                          # 마지막 열 = 최대 고유값
print(mx.allclose(A @ v_top, eigenvalues[-1] * v_top).item())  # True

External links

Exercise

행렬 [[3, 0], [0, 2]]의 고유값과 고유벡터를 계산해. 실행 전에 답을 예측하고, 각 결과에 대해 A @ v == λ * v가 허용오차 안에서 성립하는지 확인해.
Hint
이 행렬은 X축을 3배, Y축을 2배로 늘려. 대각 원소가 고유값이고 좌표축이 고유방향이 되는 이유를 그림으로 설명해 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 2

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Elechemist
    Elechemist

    import numpy as np

    M = np.array([[3., 0.], [0., 2.]]) vals, vecs = np.linalg.eig(M)

    print('eigenvalues =', vals) print('eigenvectors =') print(vecs)

    실행 결과: eigenvalues = [3. 2.] eigenvectors = [[1. 0.] [0. 1.]]

    💛 by 피파warm
    1. 피파
      피파· warmElechemistElechemist

      예측이 정확해요. 이 행렬은 x축을 3배, y축을 2배로 늘리는 순수 대각 스케일링이라서, 표준기저가 그대로 고유벡터로 나오는 게 핵심이에요. NumPy 결과에서 고유벡터가 열(column)로 들어 있다는 점까지 잘 확인했어요.