Ch.6 §6.2 — 행렬의 대각화 (Diagonalizing a Matrix)

A = SΛS⁻¹ 의 유도, 기저 변환의 직관, 거듭제곱·스펙트럼 분해·결함 행렬

독립 고유벡터로 구성된 행렬 S 와 고유값을 대각에 둔 Λ 를 사용해 A = SΛS⁻¹ 로 분해하는 대각화(diagonalization)를 상세히 전개한다. 좌표 변환의 관점에서 왜 이것이 “행렬을 가장 단순한 형태로 보는” 일인지 직관적으로 풀고, 거듭제곱·스펙트럼 분해·행렬 함수·결함 행렬·PCA 응용까지 연결한다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 10일

1 대각화는 왜 하는가 — 얽힘을 풀어내는 언어

행렬 \(\mathbf{A}\) 를 벡터에 작용하는 변환으로 보면, 일반적으로 좌표계의 각 축(\(\mathbf{e}_1, \mathbf{e}_2, \ldots\))들이 서로 얽혀(coupled) 있다. \(\mathbf{A}\)\((i, j)\) 성분은 “입력의 \(j\) 축 성분이 출력의 \(i\) 축에 얼마나 섞여 들어가는가”를 나타내기 때문이다. 이 얽힘 때문에 \(\mathbf{A}^{100}\) 을 구하려면 100번을 곱해야 하고, \(\frac{d\mathbf{u}}{dt} = \mathbf{A}\mathbf{u}\) 라는 연립 미분방정식은 따로 풀기 어렵다.

그런데 고유벡터를 축으로 삼는 새로운 좌표계로 옮기면 얽힘이 완전히 풀린다. 각 고유벡터 방향은 \(\mathbf{A}\) 에 의해 자기 자신으로만 \(\lambda\) 배 스케일되므로, 다른 방향과 섞이지 않는다. 이 새 좌표계에서 \(\mathbf{A}\) 는 오직 대각 원소만 갖는 대각 행렬 \(\mathbf{\Lambda}\) 가 된다.

핵심 직관 — 좌표계를 바꾸는 일

대각화는 \(\mathbf{A}\) 의 본질을 바꾸는 일이 아니라, 바라보는 좌표계를 바꾸는 일이다.

  • 표준 좌표계에서 \(\mathbf{A}\) 는 복잡한 섞임 행렬로 보인다.
  • 고유벡터 좌표계에서 같은 \(\mathbf{A}\) 는 단순한 대각 행렬 \(\mathbf{\Lambda}\) 로 보인다.

\(\mathbf{S}\) 는 두 좌표계 사이의 번역기(translator) 역할을 한다: 표준 좌표 → 고유벡터 좌표로 갈 때는 \(\mathbf{S}^{-1}\) 을, 돌아올 때는 \(\mathbf{S}\) 를 곱한다.

이 관점에서 대각화 공식 \(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\) 는 다음과 같이 읽힌다:

\[ \underbrace{\mathbf{A}\mathbf{v}}_{\text{표준 좌표에서 변환}} = \underbrace{\mathbf{S}}_{\text{고유 좌표} \to \text{표준}} \underbrace{\mathbf{\Lambda}}_{\text{고유 좌표에서 스케일}} \underbrace{\mathbf{S}^{-1}}_{\text{표준} \to \text{고유 좌표}} \mathbf{v} \]

즉, “\(\mathbf{v}\) 를 고유 좌표로 번역하고 → 각 축을 \(\lambda_i\) 배 스케일하고 → 다시 표준 좌표로 되돌리는” 3단계 과정이 \(\mathbf{A}\) 한 번 곱하기와 같다.


2 대각화의 유도

2.1 행렬 형태의 \(\mathbf{A}\mathbf{x} = \lambda\mathbf{x}\)

\(n \times n\) 행렬 \(\mathbf{A}\)\(n\) 개의 독립 고유벡터 \(\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n\) 과 그에 대응하는 고유값 \(\lambda_1, \lambda_2, \ldots, \lambda_n\) 을 갖는다고 하자. 각 고유벡터는 정의상:

\[\mathbf{A}\mathbf{x}_i = \lambda_i \mathbf{x}_i, \quad i = 1, 2, \ldots, n\]

\(n\) 개의 방정식을 한 번에 쓰려면 고유벡터를 열(column)로 나열한 행렬 \(\mathbf{S}\) 를 도입한다:

\[ \mathbf{S} = \begin{bmatrix} | & | & & | \\ \mathbf{x}_1 & \mathbf{x}_2 & \cdots & \mathbf{x}_n \\ | & | & & | \end{bmatrix} \]

이제 \(\mathbf{A}\mathbf{S}\) 를 열별로 계산하면:

\[ \mathbf{A}\mathbf{S} = \begin{bmatrix} | & | & & | \\ \mathbf{A}\mathbf{x}_1 & \mathbf{A}\mathbf{x}_2 & \cdots & \mathbf{A}\mathbf{x}_n \\ | & | & & | \end{bmatrix} = \begin{bmatrix} | & | & & | \\ \lambda_1\mathbf{x}_1 & \lambda_2\mathbf{x}_2 & \cdots & \lambda_n\mathbf{x}_n \\ | & | & & | \end{bmatrix} \]

오른쪽 행렬은 \(\mathbf{S}\) 와 대각 행렬 \(\mathbf{\Lambda} = \text{diag}(\lambda_1, \ldots, \lambda_n)\) 의 곱으로 쓸 수 있다:

\[ \begin{bmatrix} | & & | \\ \lambda_1\mathbf{x}_1 & \cdots & \lambda_n\mathbf{x}_n \\ | & & | \end{bmatrix} = \begin{bmatrix} | & & | \\ \mathbf{x}_1 & \cdots & \mathbf{x}_n \\ | & & | \end{bmatrix} \begin{bmatrix} \lambda_1 & & \\ & \ddots & \\ & & \lambda_n \end{bmatrix} = \mathbf{S}\mathbf{\Lambda} \]

주의: 곱하는 순서가 중요하다. \(\mathbf{S}\mathbf{\Lambda}\)\(\mathbf{S}\)\(i\) 번째 열에 \(\lambda_i\) 를 곱하지만, \(\mathbf{\Lambda}\mathbf{S}\)\(\mathbf{S}\)\(i\) 번째 행에 \(\lambda_i\) 를 곱한다. 따라서 \(\mathbf{A}\mathbf{S} = \mathbf{S}\mathbf{\Lambda}\) 이지, \(\mathbf{A}\mathbf{S} = \mathbf{\Lambda}\mathbf{S}\) 가 아니다.

2.2 대각화 공식

\(\mathbf{A}\mathbf{S} = \mathbf{S}\mathbf{\Lambda}\) 를 얻었다. \(\mathbf{S}\)가역(invertible)이면 양변에 \(\mathbf{S}^{-1}\) 을 곱해 두 가지 형태로 쓸 수 있다:

대각화 공식 (Diagonalization Formula)

\(n \times n\) 행렬 \(\mathbf{A}\)\(n\) 개의 선형 독립 고유벡터를 가지면:

\[\mathbf{S}^{-1} \mathbf{A} \mathbf{S} = \mathbf{\Lambda}\]

또는 이를 \(\mathbf{A}\) 에 대해 풀면:

\[\mathbf{A} = \mathbf{S} \mathbf{\Lambda} \mathbf{S}^{-1}\]

  • \(\mathbf{S}\): 고유벡터를 열로 가진 고유벡터 행렬(eigenvector matrix)
  • \(\mathbf{\Lambda}\): 고유값을 대각에 가진 고유값 행렬(eigenvalue matrix), 다른 성분은 모두 0
  • \(\mathbf{\Lambda}\)\(i\) 번째 대각 원소는 \(\mathbf{S}\)\(i\) 번째 열 고유벡터에 대응하는 고유값이다

\(\mathbf{S}\) 가 가역이어야 하는가? 고유벡터들이 선형 종속이면 \(\mathbf{S}\) 의 열이 독립이 아니라 \(\det(\mathbf{S}) = 0\), 즉 \(\mathbf{S}^{-1}\) 이 존재하지 않는다. 이 경우 대각화가 불가능하다. 고유벡터의 선형 독립성이 대각화의 유일한 필수 조건이다.

2.3 순서의 약속

\(\mathbf{S}\) 의 열과 \(\mathbf{\Lambda}\) 의 대각 원소는 반드시 같은 순서로 나열되어야 한다. 첫 번째 열이 \(\mathbf{x}_1\) 이면 첫 번째 대각 원소는 \(\lambda_1\) 이어야 한다. 순서를 바꾸고 싶다면 \(\mathbf{S}\)\(\mathbf{\Lambda}\) 모두에서 같은 순열을 적용한다.

이 유연성은 나중에 “지배 고유값을 맨 앞에 두는” 정렬이나 PCA의 분산이 큰 순서로 주성분을 나열하는 관습으로 이어진다.


3 대각화의 조건

3.1 언제 대각화 가능한가

대각화 가능성 정리 (Diagonalizability Theorem)

\(n \times n\) 행렬 \(\mathbf{A}\) 가 대각화 가능할 필요충분조건은 \(\mathbf{A}\)\(n\) 개의 선형 독립 고유벡터를 갖는 것이다.

충분조건 하나: 고유값이 모두 서로 다르면 고유벡터는 자동으로 독립이다. 따라서 \(n\) 개의 서로 다른 고유값을 가진 행렬은 항상 대각화 가능하다.

3.2 서로 다른 고유값 → 독립 고유벡터 (증명 스케치)

\(\lambda_1 \neq \lambda_2\) 에 대응하는 고유벡터 \(\mathbf{x}_1, \mathbf{x}_2\) 가 종속이라고 가정하자. 그러면:

\[c_1 \mathbf{x}_1 + c_2 \mathbf{x}_2 = \mathbf{0}, \quad (c_1, c_2) \neq (0, 0)\]

양변에 \(\mathbf{A}\) 를 곱하면:

\[c_1 \lambda_1 \mathbf{x}_1 + c_2 \lambda_2 \mathbf{x}_2 = \mathbf{0}\]

첫 식에 \(\lambda_2\) 를 곱하고 두 번째 식에서 빼면:

\[c_1 (\lambda_1 - \lambda_2) \mathbf{x}_1 = \mathbf{0}\]

\(\lambda_1 \neq \lambda_2\) 이고 \(\mathbf{x}_1 \neq \mathbf{0}\) 이므로 \(c_1 = 0\). 같은 방법으로 \(c_2 = 0\). 모순이다. 따라서 \(\mathbf{x}_1, \mathbf{x}_2\) 는 독립이다.

이 논증은 \(j\) 개의 서로 다른 고유값으로 직접 확장된다 (Strang, 2009, Ch.6.2).

3.3 대각화 vs 가역성 — 독립적인 개념

두 개념이 자주 혼동되지만 완전히 독립이다.

행렬 가역? 대각화 가능?
\(\mathbf{I}\) (단위행렬) O (\(\lambda_i\) 모두 1, 모두 0이 아님) O (모든 벡터가 고유벡터)
\(\begin{bmatrix}0 & 0\\0 & 0\end{bmatrix}\) (영행렬) X (\(\lambda = 0\)) O (고유벡터 \(\mathbf{e}_1, \mathbf{e}_2\))
\(\begin{bmatrix}1 & 1\\0 & 1\end{bmatrix}\) (전단 행렬) O (\(\det=1\)) X (중복 고유값 \(\lambda=1\), 고유벡터 1개)
\(\begin{bmatrix}0 & 1\\0 & 0\end{bmatrix}\) (nilpotent) X (\(\det=0\)) X (고유값 \(0\) 중복, 고유벡터 1개)

핵심 구분:

  • 가역성은 고유값에 대한 성질이다 — 모든 \(\lambda_i \neq 0\) 이어야 한다.
  • 대각화 가능성은 고유벡터에 대한 성질이다 — 독립 고유벡터가 \(n\) 개 있어야 한다.

4 행렬 거듭제곱 — 대각화의 첫 번째 열매

대각화를 하면 \(\mathbf{A}^k\) 계산이 극적으로 단순해진다.

\[ \mathbf{A}^2 = (\mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1})(\mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}) = \mathbf{S}\mathbf{\Lambda}(\mathbf{S}^{-1}\mathbf{S})\mathbf{\Lambda}\mathbf{S}^{-1} = \mathbf{S}\mathbf{\Lambda}^2\mathbf{S}^{-1} \]

가운데 \(\mathbf{S}^{-1}\mathbf{S} = \mathbf{I}\) 가 사라지는 것이 핵심이다. 일반적으로:

\[\mathbf{A}^k = \mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\]

그리고 \(\mathbf{\Lambda}^k\) 는 그냥 대각 원소를 \(k\) 제곱하면 끝이다:

\[ \mathbf{\Lambda}^k = \begin{bmatrix} \lambda_1^k & & \\ & \ddots & \\ & & \lambda_n^k \end{bmatrix} \]

계산량 비교

방법 계산량
직접 곱셈 \(\mathbf{A}^k\) \(O(kn^3)\)\(k\) 번 행렬 곱
대각화 경로 \(\mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\) \(O(n^3 + kn)\) — 초기 비용 + 스칼라 \(k\) 제곱 \(n\)

\(k = 100\), \(n = 10\) 일 때 전자는 \(10^5\) 연산, 후자는 \(10^3 + 10^3 = 2 \times 10^3\) 연산. 행렬이 커지고 \(k\) 가 커질수록 이득이 급격히 커진다.

4.1 역행렬과 음의 거듭제곱

모든 \(\lambda_i \neq 0\) 이면 \(\mathbf{A}^{-1}\) 도 대각화 공식으로 바로 쓸 수 있다:

\[\mathbf{A}^{-1} = \mathbf{S}\mathbf{\Lambda}^{-1}\mathbf{S}^{-1}, \quad \mathbf{\Lambda}^{-1} = \text{diag}(1/\lambda_1, \ldots, 1/\lambda_n)\]

이로부터 \(\mathbf{A}^k\) 공식은 음의 정수 \(k\) 에 대해서도 그대로 유효하다.

4.2 행렬 함수 (Matrix Functions)

거듭제곱 뿐 아니라 임의의 해석적 함수 \(f\) 에 대해:

\[f(\mathbf{A}) = \mathbf{S} f(\mathbf{\Lambda}) \mathbf{S}^{-1}, \quad f(\mathbf{\Lambda}) = \text{diag}(f(\lambda_1), \ldots, f(\lambda_n))\]

가장 중요한 예: 행렬 지수 함수

\[e^{\mathbf{A}t} = \mathbf{S}\, e^{\mathbf{\Lambda} t}\, \mathbf{S}^{-1} = \mathbf{S}\, \text{diag}(e^{\lambda_1 t}, \ldots, e^{\lambda_n t})\, \mathbf{S}^{-1}\]

이것이 선형 연립 미분방정식 \(\frac{d\mathbf{u}}{dt} = \mathbf{A}\mathbf{u}\) 의 해 \(\mathbf{u}(t) = e^{\mathbf{A}t}\mathbf{u}(0)\) 을 계산 가능하게 만드는 핵심이다.

직관: 스칼라 함수가 실수선을 어떻게 변환하는지 알면, 그 행렬 버전은 고유값 방향을 따라 정확히 같은 방식으로 변환한다. 고유벡터 축은 일종의 “독립적 실수선”으로 작동한다.


5 스펙트럼 분해 (Spectral Decomposition)

\(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\) 을 다르게 보는 관점이 있다. \(\mathbf{S}^{-1}\) 의 행을 \(\mathbf{y}_1^\top, \ldots, \mathbf{y}_n^\top\) 로 두면(이들을 좌측 고유벡터(left eigenvectors)라 한다):

\[\mathbf{A} = \sum_{i=1}^n \lambda_i \mathbf{x}_i \mathbf{y}_i^\top\]

이것이 스펙트럼 분해이다. 각 항 \(\mathbf{x}_i\mathbf{y}_i^\top\)랭크 1 투영(rank-1 projection) 연산자이고, \(\mathbf{A}\) 는 이들의 \(\lambda_i\) 가중합으로 분해된다.

직관: 행렬 \(\mathbf{A}\)\(n\) 개의 독립적인 1차원 모드의 중첩이다. 각 모드는 “방향 \(\mathbf{x}_i\) 로의 투영에 \(\lambda_i\) 를 곱하는” 연산이다.

대칭 행렬의 경우 \(\mathbf{S}\) 를 직교 행렬 \(\mathbf{Q}\) 로 잡을 수 있고 \(\mathbf{y}_i = \mathbf{x}_i\) 가 되어:

\[\mathbf{A} = \sum_{i=1}^n \lambda_i \mathbf{x}_i \mathbf{x}_i^\top, \quad \mathbf{x}_i^\top \mathbf{x}_j = \delta_{ij}\]

이것이 PCA, SVD의 수학적 기반이다.


6 대각화 계산 예시

6.1 예시 1: \(2 \times 2\) 삼각 행렬

\[\mathbf{A} = \begin{bmatrix} 1 & 5 \\ 0 & 6 \end{bmatrix}\]

Step 1 — 고유값: 삼각 행렬이므로 대각 원소가 그대로 고유값이다. \(\lambda_1 = 1\), \(\lambda_2 = 6\).

Step 2 — 고유벡터:

\(\lambda_1 = 1\): \((\mathbf{A} - \mathbf{I})\mathbf{x} = \begin{bmatrix}0 & 5\\0 & 5\end{bmatrix}\mathbf{x} = \mathbf{0}\)\(\mathbf{x}_1 = \begin{bmatrix}1\\0\end{bmatrix}\)

\(\lambda_2 = 6\): \((\mathbf{A} - 6\mathbf{I})\mathbf{x} = \begin{bmatrix}-5 & 5\\0 & 0\end{bmatrix}\mathbf{x} = \mathbf{0}\)\(\mathbf{x}_2 = \begin{bmatrix}1\\1\end{bmatrix}\)

Step 3 — 대각화 구성:

\[\mathbf{S} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}, \quad \mathbf{S}^{-1} = \begin{bmatrix} 1 & -1 \\ 0 & 1 \end{bmatrix}, \quad \mathbf{\Lambda} = \begin{bmatrix} 1 & 0 \\ 0 & 6 \end{bmatrix}\]

Step 4 — 검산:

\[\mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1} = \begin{bmatrix}1 & 1\\0 & 1\end{bmatrix}\begin{bmatrix}1 & 0\\0 & 6\end{bmatrix}\begin{bmatrix}1 & -1\\0 & 1\end{bmatrix} = \begin{bmatrix}1 & 6\\0 & 6\end{bmatrix}\begin{bmatrix}1 & -1\\0 & 1\end{bmatrix} = \begin{bmatrix}1 & 5\\0 & 6\end{bmatrix} = \mathbf{A}\]

Step 5 — 거듭제곱: \(\mathbf{A}^k = \mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\) 공식에 대입하면:

\[\mathbf{A}^k = \begin{bmatrix}1 & 1\\0 & 1\end{bmatrix}\begin{bmatrix}1 & 0\\0 & 6^k\end{bmatrix}\begin{bmatrix}1 & -1\\0 & 1\end{bmatrix} = \begin{bmatrix}1 & 6^k - 1\\0 & 6^k\end{bmatrix}\]

100번 곱할 필요 없이 \(6^{100}\) 하나로 끝난다. 이것이 대각화의 힘이다.

6.2 예시 2: 마르코프 행렬과 장기 거동

\[\mathbf{A} = \begin{bmatrix} 0.8 & 0.3 \\ 0.2 & 0.7 \end{bmatrix}\]

고유값: \(\text{tr}(\mathbf{A}) = 1.5\), \(\det(\mathbf{A}) = 0.5\) 이므로 \(\lambda^2 - 1.5\lambda + 0.5 = 0\)\(\lambda_1 = 1\), \(\lambda_2 = 0.5\).

고유벡터: \(\mathbf{x}_1 = \begin{bmatrix}0.6\\0.4\end{bmatrix}\) (\(\lambda_1 = 1\)), \(\mathbf{x}_2 = \begin{bmatrix}1\\-1\end{bmatrix}\) (\(\lambda_2 = 0.5\)).

대각화:

\[\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1} = \begin{bmatrix}0.6 & 1\\0.4 & -1\end{bmatrix}\begin{bmatrix}1 & 0\\0 & 0.5\end{bmatrix}\begin{bmatrix}1 & 1\\0.4 & -0.6\end{bmatrix}\]

장기 거동: \(\mathbf{A}^k = \mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\) 에서 \(\lambda_1^k = 1\), \(\lambda_2^k = 0.5^k \to 0\). 따라서:

\[\mathbf{A}^\infty = \mathbf{S}\begin{bmatrix}1 & 0\\0 & 0\end{bmatrix}\mathbf{S}^{-1} = \begin{bmatrix}0.6 & 0.6\\0.4 & 0.4\end{bmatrix}\]

두 열이 모두 지배 고유벡터 \(\mathbf{x}_1 = (0.6, 0.4)^\top\) 이다. 초기 상태와 무관하게 모든 확률 분포가 정상상태로 수렴한다 — 이것이 마르코프 체인의 에르고딕성(ergodicity)이 기하학적으로 의미하는 바이다.


7 결함 행렬 — 대각화가 실패하는 경우

모든 행렬이 대각화 가능한 것은 아니다. 대각화에 실패하는 행렬을 결함 행렬(defective matrix)이라 한다.

7.1 대표적인 결함 행렬

\[\mathbf{A} = \begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}\]

고유값: \(\det(\mathbf{A} - \lambda\mathbf{I}) = (1-\lambda)(-1-\lambda) + 1 = \lambda^2 = 0\)\(\lambda = 0\) (중복).

고유벡터: \((\mathbf{A} - 0\mathbf{I})\mathbf{x} = \mathbf{A}\mathbf{x} = \mathbf{0}\)\(\begin{bmatrix}1 & -1\\1 & -1\end{bmatrix}\mathbf{x} = \mathbf{0}\)\(\mathbf{x} = c\begin{bmatrix}1\\1\end{bmatrix}\) (1차원).

\(2 \times 2\) 행렬인데 독립 고유벡터가 1개뿐이므로 \(\mathbf{S}\) 를 구성할 수 없다. 대각화 불가.

7.2 중복 고유값이면 항상 결함인가?

아니다. 중복 고유값이 있어도 기하적 중복도(독립 고유벡터의 수)가 대수적 중복도(특성 다항식 근으로서의 중복도)와 같으면 대각화 가능하다.

행렬 고유값 기하적 중복도 대각화
\(\mathbf{I} = \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}\) \(\lambda = 1\) (중복 2) 2 O
\(\begin{bmatrix}1 & 1\\0 & 1\end{bmatrix}\) \(\lambda = 1\) (중복 2) 1 X

단위행렬은 모든 벡터가 고유벡터라 중복도가 2, 전단 행렬은 한 방향만 고정되어 중복도가 1이다.

7.3 결함 행렬에는 어떤 대안이 있는가

  1. Jordan 표준형: 대각화 대신 Jordan 블록으로 구성된 준대각 형태로 분해한다. 결함 행렬에 대한 “차선책”이다.
  2. Schur 분해: \(\mathbf{A} = \mathbf{Q}\mathbf{T}\mathbf{Q}^\top\) (\(\mathbf{T}\) 는 상삼각). 복소수를 허용하면 모든 정방행렬에 항상 존재한다.
  3. 특이값 분해(SVD): \(\mathbf{A} = \mathbf{U}\mathbf{\Sigma}\mathbf{V}^\top\). 정방·대칭이 아닌 모든 행렬에 적용되며, 결함 여부와 무관하게 항상 가능하다.

이들은 모두 대각화의 일반화된 형태이다.


8 응용 분야

분야 응용 대각화의 역할
머신러닝 (PCA) 차원 축소 공분산 행렬의 고유값 분해로 분산이 큰 방향 탐색
수치해석 선형 시스템 조건수 \(\kappa = |\lambda_{\max}/\lambda_{\min}|\) 로 안정성 판단
미분방정식 ODE 풀이 \(e^{\mathbf{A}t}\)\(e^{\lambda_i t}\) 의 조합으로 계산
동역학 시스템 안정성 분석 모든 \(|\lambda_i| < 1\) (이산) 또는 \(\text{Re}(\lambda_i) < 0\) (연속)이면 안정
검색엔진 PageRank 전이 행렬의 지배 고유벡터로 수렴
생태학 Leslie 인구 모델 장기 인구 성장률 = 지배 고유값
양자역학 에너지 고유상태 Hamiltonian의 대각화 = 에너지 레벨 찾기
진동 해석 정규 모드 분석 결합된 진동 시스템을 독립 모드로 분리

8.1 PCA와의 연결 고리

\(p\) 차원 데이터 \(n\) 개를 모은 중심화된 행렬을 \(\mathbf{X} \in \mathbb{R}^{n \times p}\) 라 하자. 공분산 행렬 \(\mathbf{C} = \frac{1}{n-1}\mathbf{X}^\top\mathbf{X}\) 는 대칭 행렬이므로 직교 대각화가 가능하다:

\[\mathbf{C} = \mathbf{Q}\mathbf{\Lambda}\mathbf{Q}^\top\]

  • \(\mathbf{Q}\) 의 열 = 주성분 방향 (단위 직교 고유벡터)
  • \(\mathbf{\Lambda}\) 의 대각 원소 = 각 주성분이 설명하는 분산

데이터를 새 좌표로 투영하면 \(\mathbf{Z} = \mathbf{X}\mathbf{Q}\). 새 좌표에서 각 축은 서로 무상관(uncorrelated)이다. 상위 \(k\) 개 고유벡터만 남기면 분산을 최대로 보존하면서 차원을 축소할 수 있다.

핵심: PCA는 “공분산 행렬의 대각화”라는 한 줄로 요약된다. 대각화는 “데이터의 얽힘을 풀어 독립 방향들로 재배열하는” 연산이다.


9 코드 예시

import numpy as np

def diagonalize(A):
    """대각화 A = S Λ S⁻¹"""
    eigenvalues, eigenvectors = np.linalg.eig(A)
    S = eigenvectors
    Lambda = np.diag(eigenvalues)
    S_inv = np.linalg.inv(S)
    return S, Lambda, S_inv

def matrix_power_via_diag(A, k):
    """대각화를 이용한 거듭제곱 A^k = S Λ^k S⁻¹"""
    S, Lambda, S_inv = diagonalize(A)
    Lambda_k = np.diag(np.diag(Lambda) ** k)
    return S @ Lambda_k @ S_inv

def matrix_exp_via_diag(A, t):
    """행렬 지수 함수 e^(At) = S diag(e^(λt)) S⁻¹"""
    S, Lambda, S_inv = diagonalize(A)
    exp_Lambda = np.diag(np.exp(np.diag(Lambda) * t))
    return S @ exp_Lambda @ S_inv

# 검증
A = np.array([[1.0, 5.0],
              [0.0, 6.0]])

S, Lambda, S_inv = diagonalize(A)
print("S =\n", S)
print("Λ =\n", Lambda)
print("S⁻¹ =\n", S_inv)
print("\n복원 S Λ S⁻¹ =\n", S @ Lambda @ S_inv)
print("원본 A =\n", A)
print("일치 여부:", np.allclose(S @ Lambda @ S_inv, A))

# A^10 비교
k = 10
A_k_direct = np.linalg.matrix_power(A, k)
A_k_diag = matrix_power_via_diag(A, k)
print(f"\nA^{k} (직접 곱셈):\n", A_k_direct)
print(f"A^{k} (대각화):\n", A_k_diag)
print("일치 여부:", np.allclose(A_k_direct, A_k_diag))
import numpy as np
import matplotlib.pyplot as plt

# 마르코프 전이 행렬
A = np.array([[0.8, 0.3],
              [0.2, 0.7]])

# 대각화
eigenvalues, eigenvectors = np.linalg.eig(A)
print("고유값:", eigenvalues)

# 초기 상태
u0 = np.array([1.0, 0.0])

# 시간별 상태 추적
ks = np.arange(0, 21)
states = np.array([np.linalg.matrix_power(A, k) @ u0 for k in ks])

# 정상상태 (지배 고유벡터, 확률 정규화)
dominant_idx = np.argmax(np.abs(eigenvalues))
steady = eigenvectors[:, dominant_idx].real
steady /= steady.sum()
print(f"정상상태: {steady}")

# 시각화
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(ks, states[:, 0], 'o-', label='상태 1')
ax.plot(ks, states[:, 1], 's-', label='상태 2')
ax.axhline(steady[0], color='C0', ls='--', alpha=0.5, label=f'정상 {steady[0]:.2f}')
ax.axhline(steady[1], color='C1', ls='--', alpha=0.5, label=f'정상 {steady[1]:.2f}')
ax.set_xlabel('단계 k')
ax.set_ylabel('확률')
ax.set_title('마르코프 체인 수렴')
ax.legend()
plt.tight_layout()
import numpy as np
from sklearn.datasets import load_iris

# iris 데이터
X, y = load_iris(return_X_y=True)
X_centered = X - X.mean(axis=0)

# 공분산 행렬 대각화
C = np.cov(X_centered.T)
eigenvalues, eigenvectors = np.linalg.eigh(C)  # 대칭 행렬 → eigh

# 고유값 큰 순으로 정렬
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]

print("고유값:", eigenvalues)
print("설명 분산 비율:", eigenvalues / eigenvalues.sum())

# 상위 2개 주성분으로 투영
Q = eigenvectors[:, :2]
X_projected = X_centered @ Q
print("\n투영 후 데이터 (처음 5개):\n", X_projected[:5])

# 검증: 주성분은 서로 직교
print("\nQᵀ Q =\n", Q.T @ Q)  # 항등행렬이어야 함
A <- matrix(c(1, 5, 0, 6), nrow = 2, byrow = TRUE)

# 대각화
result <- eigen(A)
S <- result$vectors
Lambda <- diag(result$values)
S_inv <- solve(S)

cat("S =\n"); print(S)
cat("Lambda =\n"); print(Lambda)
cat("S %*% Lambda %*% S_inv =\n"); print(S %*% Lambda %*% S_inv)
cat("A =\n"); print(A)

# A^k 대각화로 계산
matrix_power <- function(A, k) {
  r <- eigen(A)
  r$vectors %*% diag(r$values^k) %*% solve(r$vectors)
}

cat("\nA^10 via 대각화:\n")
print(matrix_power(A, 10))

# PCA with iris
data(iris)
X <- scale(iris[, 1:4], center = TRUE, scale = FALSE)
C <- cov(X)
pc <- eigen(C)

cat("\n고유값 (설명 분산):\n"); print(pc$values)
cat("설명 분산 비율:\n"); print(pc$values / sum(pc$values))

10 정리

개념 핵심 공식 직관
대각화 \(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\) 고유벡터를 축으로 삼는 좌표 변환
거듭제곱 \(\mathbf{A}^k = \mathbf{S}\mathbf{\Lambda}^k\mathbf{S}^{-1}\) 각 고유 방향이 \(\lambda^k\) 씩 독립 스케일
행렬 함수 \(f(\mathbf{A}) = \mathbf{S} f(\mathbf{\Lambda}) \mathbf{S}^{-1}\) 스칼라 함수를 고유값별로 적용
조건 \(n\) 개의 독립 고유벡터 \(\mathbf{S}\) 가 가역이어야 \(\mathbf{S}^{-1}\) 이 존재
결함 행렬 독립 고유벡터 부족 대각화 불가 → Jordan / SVD
스펙트럼 분해 \(\mathbf{A} = \sum \lambda_i \mathbf{x}_i \mathbf{y}_i^\top\) 랭크 1 투영의 가중합

대각화는 선형대수의 여러 흐름이 만나는 지점이다. 특성 방정식으로 고유값을 구하고, 영공간으로 고유벡터를 구하고, 독립성·가역성·기저 변환의 개념이 모두 한 자리에 모인다. 그리고 그 결과는 미분방정식·PCA·PageRank·양자역학까지 전혀 달라 보이는 분야들을 같은 수식 \(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\) 로 묶어낸다.


11 관련 주제

선행 지식

Ch.6 세부 주제

후속 주제

  • 1111-11-11, 특이값 분해 (SVD) — 모든 행렬에 적용 가능한 일반 분해

Subscribe

Enjoy this blog? Get notified of new posts by email: