1 왜 고유값인가 — 동적 문제의 언어
지금까지 선형대수는 \(A\mathbf{x} = \mathbf{b}\) 라는 정적(steady-state) 문제를 중심으로 전개되었다. 행을 소거하고, 역행렬을 구하고, 최소제곱 해를 찾는 모든 작업은 “지금 이 순간의 값”을 구하는 데 집중한다.
그런데 현실에는 시간에 따라 변하는 동적(dynamic) 문제가 훨씬 많다.
- 마르코프 체인: 웹페이지 방문 확률이 시간이 지나면서 어떻게 수렴하는가?
- 미분방정식: \(\frac{d\mathbf{u}}{dt} = A\mathbf{u}\) 의 해는 어떻게 성장·붕괴·진동하는가?
- 행렬 거듭제곱: \(A^{100}\mathbf{x}\) 를 100번 곱하지 않고 구할 수 있는가?
이 세 질문 모두 같은 답에 의존한다. 바로 고유값(eigenvalue)과 고유벡터(eigenvector)이다. 고유벡터는 행렬 \(A\) 를 곱해도 방향이 바뀌지 않는 특별한 벡터이고, 고유값은 그 벡터의 길이가 몇 배 늘어나거나 줄어드는지를 나타내는 수이다.
\(A\) 를 “벡터를 입력받아 다른 벡터를 출력하는 함수”로 보면:
- 일반 벡터 \(\mathbf{v}\) 를 입력하면 \(A\mathbf{v}\) 는 방향도, 길이도 바뀐다.
- 고유벡터 \(\mathbf{x}\) 를 입력하면 \(A\mathbf{x} = \lambda \mathbf{x}\) — 방향은 그대로, 길이만 \(\lambda\) 배 변한다.
고유벡터는 \(A\) 의 “고유한 축(axis)”이다. 이 축을 따라 움직이는 성분은 행렬에 의해 흐트러지지 않는다.
2 정의 (Definition)
\(n \times n\) 정방행렬 \(\mathbf{A}\) 에 대해, 다음을 만족하는 영벡터가 아닌 벡터 \(\mathbf{x} \in \mathbb{R}^n\) 와 스칼라 \(\lambda \in \mathbb{C}\) 의 쌍이 존재하면:
\[\mathbf{A}\mathbf{x} = \lambda \mathbf{x}\]
- \(\mathbf{x}\) 를 \(\mathbf{A}\) 의 고유벡터(eigenvector),
- \(\lambda\) 를 해당 고유벡터에 대응하는 고유값(eigenvalue)이라 한다.
표기 정리
| 기호 | 의미 |
|---|---|
| \(\mathbf{A}\) | \(n \times n\) 정방행렬 |
| \(\mathbf{x}\) | 고유벡터 (영벡터 제외, \(\mathbf{x} \neq \mathbf{0}\)) |
| \(\lambda\) | 고유값 (실수 또는 복소수) |
| \(\lambda \mathbf{x}\) | 고유벡터의 스칼라 배 |
영벡터를 제외하는 이유: \(\mathbf{A}\mathbf{0} = \lambda \mathbf{0}\) 은 모든 \(\lambda\) 에 대해 성립하므로, 영벡터를 허용하면 고유값을 정의할 수 없다.
3 기하학적 직관 (Geometric Intuition)
수식 \(\mathbf{A}\mathbf{x} = \lambda \mathbf{x}\) 를 기하학적으로 읽으면:
“행렬 \(\mathbf{A}\) 가 벡터 \(\mathbf{x}\) 를 같은 선(span) 위에 남겨둔다.”
\(\lambda\) 의 값에 따라 고유벡터가 어떻게 변하는지 직관적으로 정리하면 다음과 같다.
| \(\lambda\) 값 | 기하학적 효과 | 예시 |
|---|---|---|
| \(\lambda = 1\) | 불변 (그대로) | 항등행렬 \(I\) 의 모든 벡터 |
| \(\lambda > 1\) | 같은 방향으로 늘어남 | 크기 확대 변환 |
| \(0 < \lambda < 1\) | 같은 방향으로 줄어듦 | 감쇠 모드 |
| \(\lambda = 0\) | 영벡터로 붕괴 | 영공간의 벡터 (\(\mathbf{A}\) 가 특이행렬) |
| \(\lambda < 0\) | 반대 방향으로 뒤집힘 | 반사 변환 |
| \(\lambda \in \mathbb{C}\) | 회전 포함 | 순수 회전 행렬 |
3.1 세 가지 고전 예시
3.1.1 투영 행렬 (Projection Matrix)
선 \(y = x\) 위로의 투영 행렬:
\[\mathbf{P} = \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix}\]
- 선 위의 벡터 \(\mathbf{x}_1 = \begin{bmatrix}1\\1\end{bmatrix}\): 투영해도 그대로이므로 \(\mathbf{P}\mathbf{x}_1 = \mathbf{x}_1\), 즉 \(\lambda_1 = 1\).
- 선에 수직인 벡터 \(\mathbf{x}_2 = \begin{bmatrix}1\\-1\end{bmatrix}\): 투영하면 \(\mathbf{0}\)이 되므로 \(\mathbf{P}\mathbf{x}_2 = \mathbf{0}\), 즉 \(\lambda_2 = 0\).
직관: 투영 행렬은 한 방향을 살리고( \(\lambda=1\) ), 다른 방향을 죽인다( \(\lambda=0\) ). 이것이 투영 행렬이 항상 고유값 \(\{0, 1\}\) 만 갖는 이유이다.
3.1.2 반사 행렬 (Reflection Matrix)
선 \(y = x\) 에 대한 반사:
\[\mathbf{R} = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\]
- \(\mathbf{x}_1 = \begin{bmatrix}1\\1\end{bmatrix}\): 반사해도 그대로. \(\lambda_1 = 1\).
- \(\mathbf{x}_2 = \begin{bmatrix}1\\-1\end{bmatrix}\): 반사하면 부호 반전. \(\lambda_2 = -1\).
핵심 관계: \(\mathbf{R} = 2\mathbf{P} - \mathbf{I}\) 이므로 고유값도 \(2(1)-1=1\), \(2(0)-1=-1\). 행렬의 선형 변환이 고유값에 그대로 적용된다.
3.1.3 회전 행렬 (Rotation Matrix)
각도 \(\theta\) 만큼 회전하는 행렬:
\[\mathbf{Q} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}\]
- \(\theta \neq 0, \pi\) 이면 어떤 실수 벡터도 방향을 유지하지 못한다.
- 고유값: \(\lambda = e^{\pm i\theta} = \cos\theta \pm i\sin\theta\) — 복소수.
직관: 순수하게 회전하는 변환은 실수 공간에서 “고정된 방향”이 없으므로 실수 고유벡터가 존재하지 않는다. 고유값이 복소수라는 것은 그 행렬이 순수한 회전 성분을 갖는다는 신호이다.
4 고유값 계산: 특성 방정식 (Characteristic Equation)
\(\mathbf{A}\mathbf{x} = \lambda \mathbf{x}\) 를 재정리하면:
\[(\mathbf{A} - \lambda \mathbf{I})\mathbf{x} = \mathbf{0}\]
이 방정식이 \(\mathbf{x} \neq \mathbf{0}\) 인 해를 가지려면, 행렬 \((\mathbf{A} - \lambda \mathbf{I})\) 가 특이행렬(singular)이어야 한다. 즉, 행렬식이 0이어야 한다.
\[\det(\mathbf{A} - \lambda \mathbf{I}) = 0\]
이를 \(\lambda\) 에 대한 \(n\) 차 다항식으로 전개한 것을 특성 다항식(characteristic polynomial)이라 하며, 그 근들이 곧 고유값이다.
왜 행렬식이 0이어야 하는가? \((\mathbf{A} - \lambda \mathbf{I})\mathbf{x} = \mathbf{0}\) 에서 \(\mathbf{x} \neq \mathbf{0}\) 인 해가 존재하려면 \((\mathbf{A} - \lambda\mathbf{I})\) 가 역행렬을 가지면 안 된다. 역행렬이 있다면 \(\mathbf{x} = (\mathbf{A}-\lambda\mathbf{I})^{-1}\mathbf{0} = \mathbf{0}\) 밖에 해가 없기 때문이다. 역행렬이 없다는 조건이 곧 \(\det(\mathbf{A}-\lambda\mathbf{I}) = 0\) 이다.
4.1 계산 절차 (2단계)
Step 1 — 고유값 구하기: 특성 방정식 \(\det(\mathbf{A} - \lambda \mathbf{I}) = 0\) 을 풀어 \(\lambda_1, \lambda_2, \ldots, \lambda_n\) 을 구한다.
Step 2 — 고유벡터 구하기: 각 \(\lambda_k\) 에 대해 연립방정식 \((\mathbf{A} - \lambda_k \mathbf{I})\mathbf{x} = \mathbf{0}\) 의 영공간(null space)을 구한다. 이 영공간의 임의의 영벡터가 아닌 원소가 고유벡터이다.
4.2 계산 예시
\(\mathbf{A} = \begin{bmatrix} 3 & 1 \\ 1 & 3 \end{bmatrix}\) 의 고유값과 고유벡터를 구한다.
Step 1: 특성 방정식
\[\det(\mathbf{A} - \lambda \mathbf{I}) = \begin{vmatrix} 3-\lambda & 1 \\ 1 & 3-\lambda \end{vmatrix} = (3-\lambda)^2 - 1 = \lambda^2 - 6\lambda + 8 = (\lambda-2)(\lambda-4) = 0\]
따라서 \(\lambda_1 = 2\), \(\lambda_2 = 4\).
Step 2: 고유벡터
\(\lambda_1 = 2\) 에 대해 \((\mathbf{A} - 2\mathbf{I})\mathbf{x} = \mathbf{0}\):
\[\begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix} \mathbf{x} = \mathbf{0} \quad \Longrightarrow \quad \mathbf{x}_1 = \begin{bmatrix} -1 \\ 1 \end{bmatrix}\]
\(\lambda_2 = 4\) 에 대해 \((\mathbf{A} - 4\mathbf{I})\mathbf{x} = \mathbf{0}\):
\[\begin{bmatrix} -1 & 1 \\ 1 & -1 \end{bmatrix} \mathbf{x} = \mathbf{0} \quad \Longrightarrow \quad \mathbf{x}_2 = \begin{bmatrix} 1 \\ 1 \end{bmatrix}\]
이 행렬은 대칭 행렬이므로 고유벡터 \(\mathbf{x}_1^\top \mathbf{x}_2 = (-1)(1) + (1)(1) = 0\) — 직교한다.
5 핵심 성질 (Key Properties)
5.1 흔적과 행렬식의 관계
행렬의 성분과 고유값 사이에는 우아한 관계가 존재한다.
\(n \times n\) 행렬 \(\mathbf{A}\) 의 고유값 \(\lambda_1, \lambda_2, \ldots, \lambda_n\) 에 대해:
\[\text{tr}(\mathbf{A}) = \sum_{i=1}^n a_{ii} = \lambda_1 + \lambda_2 + \cdots + \lambda_n\]
\[\det(\mathbf{A}) = \lambda_1 \cdot \lambda_2 \cdots \lambda_n\]
왜 이 관계가 성립하는가? 특성 다항식 \(\det(\mathbf{A} - \lambda \mathbf{I})\) 를 전개하면 \(\lambda\) 의 계수와 상수항에 각각 trace와 determinant가 나타난다 (비에타 공식의 응용).
실용적 활용: \(2\times 2\) 행렬에서 고유값을 빠르게 검산하거나 추정하는 데 유용하다.
위 예시 검산: \(\lambda_1 + \lambda_2 = 2 + 4 = 6 = \text{tr}(\mathbf{A})\) ✓, \(\lambda_1 \cdot \lambda_2 = 8 = \det(\mathbf{A})\) ✓
5.2 행렬 연산과 고유값
| 연산 | 고유벡터 | 고유값 | 이유 |
|---|---|---|---|
| \(c\mathbf{A}\) (스칼라 곱) | \(\mathbf{x}\) (동일) | \(c\lambda\) | \((c\mathbf{A})\mathbf{x} = c(\mathbf{A}\mathbf{x}) = c\lambda\mathbf{x}\) |
| \(\mathbf{A} + c\mathbf{I}\) (단위행렬 이동) | \(\mathbf{x}\) (동일) | \(\lambda + c\) | \((\mathbf{A}+c\mathbf{I})\mathbf{x} = \lambda\mathbf{x} + c\mathbf{x} = (\lambda+c)\mathbf{x}\) |
| \(\mathbf{A}^k\) (행렬 거듭제곱) | \(\mathbf{x}\) (동일) | \(\lambda^k\) | \(\mathbf{A}^k\mathbf{x} = \mathbf{A}^{k-1}(\lambda\mathbf{x}) = \cdots = \lambda^k\mathbf{x}\) |
| \(\mathbf{A}^{-1}\) (역행렬, 존재할 때) | \(\mathbf{x}\) (동일) | \(1/\lambda\) | \(\mathbf{A}\mathbf{x} = \lambda\mathbf{x}\) 에서 양변에 \(\mathbf{A}^{-1}/\lambda\) |
| \(\mathbf{A}^\top\) (전치) | 다를 수 있음 | \(\lambda\) (동일) | \(\det(\mathbf{A}^\top - \lambda\mathbf{I}) = \det(\mathbf{A} - \lambda\mathbf{I})\) |
\(\mathbf{A}^k\) 의 직관: 고유벡터 방향으로 분해하면, 각 성분은 독립적으로 \(\lambda^k\) 배 스케일된다. 이것이 행렬 거듭제곱을 효율적으로 계산하는 원리이다.
5.3 삼각 행렬의 고유값
상삼각 또는 하삼각 행렬의 고유값은 대각 원소 그 자체이다.
\[\mathbf{U} = \begin{bmatrix} 3 & 5 & 7 \\ 0 & 2 & 4 \\ 0 & 0 & 1 \end{bmatrix} \quad \Rightarrow \quad \lambda_1 = 3,\ \lambda_2 = 2,\ \lambda_3 = 1\]
이유: \(\det(\mathbf{U} - \lambda\mathbf{I}) = (3-\lambda)(2-\lambda)(1-\lambda)\) — 삼각 행렬의 행렬식은 대각 원소의 곱이다.
6 중복 고유값과 결함 행렬 (Repeated Eigenvalues and Defective Matrices)
특성 방정식이 중근 \(\lambda\) 를 갖는 경우, 그에 대응하는 독립 고유벡터의 수가 대수적 중복도(algebraic multiplicity)보다 적을 수 있다.
\[\mathbf{A} = \begin{bmatrix} 3 & 1 \\ 0 & 3 \end{bmatrix}\]
특성 방정식: \((3-\lambda)^2 = 0\) 이므로 \(\lambda = 3\) (대수적 중복도 2).
그런데 \((\mathbf{A} - 3\mathbf{I})\mathbf{x} = \mathbf{0}\) 은 오직 \(\mathbf{x} = \begin{bmatrix}1\\0\end{bmatrix}\) 방향의 고유벡터만 준다 (기하적 중복도 1).
독립 고유벡터가 2개인 \(2\times 2\) 행렬을 기대했지만, 이 행렬은 고유벡터가 1개뿐이다. 이런 행렬을 결함 행렬(defective matrix)이라 한다.
결함 행렬은 대각화할 수 없다. 이 경우 Jordan 표준형을 사용한다.
7 대칭 행렬의 특별한 성질
대칭 행렬 \(\mathbf{A} = \mathbf{A}^\top\) 은 고유값 분해에서 특히 좋은 성질을 갖는다 (Strang, 2009, Ch.6).
실수 대칭 행렬 \(\mathbf{A} \in \mathbb{R}^{n \times n}\) 의 고유값은 모두 실수이며, 서로 다른 고유값에 대응하는 고유벡터는 서로 직교한다. 더 강하게: \(\mathbf{A}\) 는 항상 직교 대각화(orthogonal diagonalization) 가능하다.
\[\mathbf{A} = \mathbf{Q} \mathbf{\Lambda} \mathbf{Q}^\top\]
여기서 \(\mathbf{Q}\) 는 직교행렬 (\(\mathbf{Q}^\top = \mathbf{Q}^{-1}\)), \(\mathbf{\Lambda}\) 는 대각에 고유값이 나열된 대각행렬이다.
직관: 대칭 행렬은 “회전 성분 없이 순수하게 늘이고 줄이기만 한다”. 그래서 복소수 고유값(회전을 표현)이 나타나지 않고, 각 고유값 방향이 서로 직교하는 깔끔한 구조를 갖는다.
8 행렬 거듭제곱과 마르코프 체인
고유벡터로 분해하면 행렬 거듭제곱을 효율적으로 계산할 수 있다.
임의 벡터 \(\mathbf{v}\) 를 고유벡터의 선형결합으로 표현한다:
\[\mathbf{v} = c_1 \mathbf{x}_1 + c_2 \mathbf{x}_2 + \cdots + c_n \mathbf{x}_n\]
그러면:
\[\mathbf{A}^k \mathbf{v} = c_1 \lambda_1^k \mathbf{x}_1 + c_2 \lambda_2^k \mathbf{x}_2 + \cdots + c_n \lambda_n^k \mathbf{x}_n\]
마르코프 체인 수렴의 원리: 마르코프 행렬은 \(|\lambda_1| = 1 > |\lambda_2| \geq \cdots \geq |\lambda_n|\) 이다. \(k \to \infty\) 이면 \(\lambda_i^k \to 0\) ( \(|\lambda_i| < 1\) )이므로 \(c_2\lambda_2^k\mathbf{x}_2 + \cdots \to \mathbf{0}\). 결국 \(\mathbf{A}^k\mathbf{v} \to c_1\mathbf{x}_1\) — 지배 고유벡터(dominant eigenvector)로 수렴한다.
\[\mathbf{A} = \begin{bmatrix} 0.8 & 0.3 \\ 0.2 & 0.7 \end{bmatrix}, \quad \lambda_1 = 1,\ \lambda_2 = 0.5\]
\(k = 100\) 이면 \(\lambda_2^{100} = (0.5)^{100} \approx 10^{-30}\). 사실상 \(\mathbf{A}^{100}\) 의 열들은 모두 정상상태 고유벡터 \(\mathbf{x}_1 = (0.6, 0.4)\) 에 수렴한다.
9 응용 분야
| 분야 | 활용 | 고유값의 역할 |
|---|---|---|
| 머신러닝 (PCA) | 데이터의 주성분 방향 탐색 | 공분산 행렬 \(\mathbf{C}\) 의 고유벡터 = 주성분 방향, 고유값 = 분산량 |
| 검색엔진 (PageRank) | 웹페이지 중요도 랭킹 | 전이행렬의 지배 고유벡터 = 정상상태 분포 |
| 물리학 / 공학 | 고유진동수 분석 | 고유값 = 진동 주파수, 고유벡터 = 진동 모드 |
| 이미지 처리 | 얼굴 인식 (Eigenface) | 공분산 행렬 분해로 핵심 이미지 방향 추출 |
| 미분방정식 | \(d\mathbf{u}/dt = \mathbf{A}\mathbf{u}\) 의 해 | 고유값 = 성장/감쇠율, 고유벡터 = 모드 형태 |
| 그래프 이론 | 연결성 분석 (Spectral Clustering) | 라플라시안 행렬의 고유값 = 군집 구조 |
| 양자역학 | 에너지 레벨 | 연산자의 고유값 = 가능한 에너지값 |
9.1 PCA 핵심 원리
데이터 행렬 \(\mathbf{X} \in \mathbb{R}^{n \times p}\) (중심화됨)에서 공분산 행렬 \(\mathbf{C} = \frac{1}{n}\mathbf{X}^\top\mathbf{X}\) 를 계산하면:
\[\mathbf{C}\mathbf{q}_k = \sigma_k^2 \mathbf{q}_k\]
여기서 \(\mathbf{q}_k\) 가 \(k\) 번째 주성분 방향이고, \(\sigma_k^2\) 가 그 방향으로의 분산이다. 고유값이 클수록 해당 방향이 데이터를 많이 설명한다. PCA는 고유값이 큰 방향부터 선택해 차원을 축소한다.
10 코드 예시
# 2x2 행렬의 고유값을 수식으로 직접 계산
import math
def eigenvalues_2x2(A):
"""
A = [[a, b], [c, d]]
특성 방정식: (a-λ)(d-λ) - bc = 0
λ^2 - (a+d)λ + (ad-bc) = 0
"""
a, b = A[0]
c, d = A[1]
trace = a + d
det = a * d - b * c
discriminant = trace**2 - 4 * det
if discriminant < 0:
# 복소수 고유값
real = trace / 2
imag = math.sqrt(-discriminant) / 2
return (complex(real, imag), complex(real, -imag))
else:
lam1 = (trace + math.sqrt(discriminant)) / 2
lam2 = (trace - math.sqrt(discriminant)) / 2
return (lam1, lam2)
def eigenvector_2x2(A, lam):
"""(A - λI)x = 0 의 영공간 — 첫 번째 행에서 풀기"""
a, b = A[0]
c, d = A[1]
# (a-λ)x + b*y = 0 → x = -b, y = a - λ (b ≠ 0 가정)
if abs(b) > 1e-10:
return [-b, a - lam]
elif abs(c) > 1e-10:
return [d - lam, -c]
else:
return [1, 0] # 이미 대각행렬 형태
A = [[3, 1], [1, 3]]
lam1, lam2 = eigenvalues_2x2(A)
print(f"고유값: λ₁ = {lam1:.4f}, λ₂ = {lam2:.4f}")
print(f"Trace 검산: {lam1 + lam2:.4f} == {A[0][0] + A[1][1]}")
print(f"Det 검산: {lam1 * lam2:.4f} == {A[0][0]*A[1][1] - A[0][1]*A[1][0]}")
x1 = eigenvector_2x2(A, lam1)
x2 = eigenvector_2x2(A, lam2)
print(f"고유벡터 x₁ = {x1}, x₂ = {x2}")
dot = x1[0]*x2[0] + x1[1]*x2[1]
print(f"내적 (직교 검산): {dot}") # 대칭 행렬이므로 0이어야 함import numpy as np
# 고유값/고유벡터 계산
A = np.array([[3, 1], [1, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("고유값:", eigenvalues)
print("고유벡터 (열벡터):\n", eigenvectors)
# 검증: Ax = λx
for i in range(len(eigenvalues)):
lam = eigenvalues[i]
x = eigenvectors[:, i]
lhs = A @ x
rhs = lam * x
print(f"\nλ = {lam:.4f}: Ax = {lhs}, λx = {rhs}, 일치: {np.allclose(lhs, rhs)}")
# Trace / Det 관계
print(f"\nTrace: {np.trace(A)} = {eigenvalues.sum():.4f}")
print(f"Det: {np.linalg.det(A):.4f} = {eigenvalues.prod():.4f}")A <- matrix(c(3, 1, 1, 3), nrow = 2, byrow = TRUE)
result <- eigen(A)
cat("고유값:", result$values, "\n")
cat("고유벡터:\n")
print(result$vectors)
# 검증
for (i in seq_along(result$values)) {
lam <- result$values[i]
x <- result$vectors[, i]
cat(sprintf("\nλ = %.4f\n", lam))
cat("Ax =", A %*% x, "\n")
cat("λx =", lam * x, "\n")
}
# Trace / Det 관계
cat("\nTrace:", sum(diag(A)), "=", sum(result$values), "\n")
cat("Det: ", det(A), "=", prod(result$values), "\n")
# PCA 예시 — iris 데이터
data(iris)
X <- scale(iris[, 1:4]) # 중심화 + 표준화
C <- cov(X) # 공분산 행렬
pc <- eigen(C)
cat("\nPCA 고유값 (설명 분산):", pc$values, "\n")
cat("주성분 1 방향:", pc$vectors[, 1], "\n")import numpy as np
# 마르코프 전이 행렬
A = np.array([[0.8, 0.3],
[0.2, 0.7]])
# 초기 상태 벡터
v = np.array([1.0, 0.0])
print(f"{'k':>5} {'v[0]':>10} {'v[1]':>10}")
print("-" * 28)
for k in [1, 2, 5, 10, 20, 50, 100]:
vk = np.linalg.matrix_power(A, k) @ v
print(f"{k:>5} {vk[0]:>10.6f} {vk[1]:>10.6f}")
# 정상상태 = 지배 고유벡터 (λ=1)
eigenvalues, eigenvectors = np.linalg.eig(A)
dominant_idx = np.argmax(np.abs(eigenvalues))
steady_state = eigenvectors[:, dominant_idx]
steady_state /= steady_state.sum() # 확률 합이 1이 되도록 정규화
print(f"\n정상상태 (고유벡터 기반): {steady_state}")11 고유값 분해와 다음 주제 연결
고유값 분해(Eigendecomposition)는 Ch.6의 핵심 결론이다. 충분한 수의 독립 고유벡터가 있으면:
\[\mathbf{A} = \mathbf{S} \mathbf{\Lambda} \mathbf{S}^{-1}\]
여기서 \(\mathbf{S}\) 는 고유벡터를 열로 세운 행렬, \(\mathbf{\Lambda}\) 는 대각에 고유값이 나열된 대각행렬이다. 이 분해가 가능한 행렬을 대각화 가능(diagonalizable) 행렬이라 한다.
\(\mathbf{A}^k = \mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\) 이므로, 행렬 거듭제곱이 \(\mathbf{\Lambda}^k = \text{diag}(\lambda_1^k, \ldots, \lambda_n^k)\) 의 계산으로 간소화된다.
대각화 불가능한 경우(결함 행렬)와 모든 행렬에 적용 가능한 더 일반적인 분해는 특이값 분해(SVD)로 이어진다.
12 관련 주제
선행 지식
- Ch.5 §5.1 — 행렬식의 성질 — 특성 방정식 \(\det(\mathbf{A} - \lambda\mathbf{I}) = 0\) 의 기반
- Ch.5 §5.3 — Cramer 공식, 역행렬, 부피 — 행렬식 계산 응용
Ch.6 세부 주제
후속 주제