Ch.7 §7.3 — 대각화와 의사역행렬 (Diagonalization and the Pseudoinverse)

더 좋은 기저로 더 좋은 행렬을 얻는다: \(S^{-1}AS=\Lambda\), \(U^{-1}AV=\Sigma\), 극분해, 그리고 \(A^+\)

§7.2 에서 “기저를 정하면 행렬이 결정된다” 는 레시피를 만들었다면, §7.3 은 그 자유도를 적극적으로 써서 가장 단순한 행렬 — 대각 행렬 을 얻는 두 가지 길을 다룬다. 같은 기저(고유벡터)로 대각화하면 \(\Lambda\) 가 나오고, 입력·출력에 서로 다른 두 정규직교 기저(특이벡터)를 쓰면 \(\Sigma\) 가 나온다. 후자가 SVD 이고, 여기서 곧장 극분해 \(A=QH\) 와 의사역행렬 \(A^+ = V\Sigma^+ U^T\) 가 따라 나온다. 의사역행렬은 역행렬이 존재하지 않을 때조차 “열공간을 행공간으로 되돌려보내는” 합리적 역할을 떠맡고, 통계의 최소제곱과 연결된다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 11일

1 이 절이 해결하는 질문

§7.2 에서 다음을 보았다.

  • 행렬은 변환의 표현일 뿐이고, 기저를 어떻게 선택하느냐에 따라 같은 변환의 행렬이 달라진다.
  • 입력 기저를 \(W\), 출력 기저도 \(W\) 로 통일하면 새 행렬은 \(B = W^{-1} A W\) 가 되어 원래 행렬과 유사(similar) 하다.
  • 입력과 출력 기저가 다르면 새 행렬은 \(B = U^{-1} A V\) 형태가 된다.

그러면 자연스러운 질문이 따라온다.

어떤 기저를 고르면 행렬이 가장 단순 해질까? 단순하다는 것을 무엇으로 정량화할까? 정사각이 아닐 때 — 또는 역행렬이 없을 때 — “역행렬에 가장 가까운 것” 은 무엇일까?

§7.3 의 답은 한 줄로 요약된다 (Strang, 2009, Ch.7 §7.3).

한 문장 요약

가장 단순한 행렬은 대각이다. 같은 기저(고유벡터)로 대각화하면 \(\Lambda\), 두 정규직교 기저로 대각화하면 \(\Sigma\). 후자에서 의사역행렬 \(A^+ = V\Sigma^+ U^T\) 가 자연스럽게 떨어진다.

이 두 가지 길을 한 표로 비교하면 다음과 같다.

항목 한 기저 (eigenbasis) 두 기저 (singular basis)
분해식 \(A = S \Lambda S^{-1}\) \(A = U \Sigma V^\top\)
좌표 변환 \(S^{-1} A S = \Lambda\) \(U^{-1} A V = \Sigma\)
입력 기저 고유벡터 \(\mathbf{x}_1, \ldots, \mathbf{x}_n\) \(\mathbf{v}_1, \ldots, \mathbf{v}_n\) (\(A^\top A\) 의 고유벡터)
출력 기저 같은 고유벡터 \(\mathbf{u}_1, \ldots, \mathbf{u}_m\) (\(A A^\top\) 의 고유벡터)
\(A\) 모양 정사각 (\(m=n\)) 직사각도 가능
항상 가능한가 아니오 (\(n\) 개 독립 고유벡터 필요) (모든 행렬에 대해)
직교 기저인가 일반적으로 아님 (\(U^{-1}=U^\top\), \(V^{-1}=V^\top\))

이 표가 §7.3 의 거의 전부다. 나머지는 이 두 길이 어떻게 같은 정신(“기저 변경 = 항등 변환”)에서 나오는지, 그리고 두 번째 길이 왜 의사역행렬을 자동으로 낳는지를 보는 일이다.


2 첫 번째 길: \(S^{-1}AS = \Lambda\) — 같은 기저로 대각화

\(V\)\(W\) 가 모두 \(\mathbb{R}^n\) 이고 표준 기저로 표현된 행렬이 \(A\) 라 하자. 이제 입력 기저와 출력 기저를 둘 다 \(A\) 의 고유벡터 \(\mathbf{x}_1, \ldots, \mathbf{x}_n\) 로 바꾼다. 새 행렬은 무엇이 되는가?

§7.2 의 레시피를 기계적으로 적용한다. 새 행렬의 \(j\) 번째 열은 \(T(\mathbf{x}_j)\) 를 새 기저(여전히 \(\mathbf{x}\) 들)로 분해한 계수다.

\[ T(\mathbf{x}_j) = A \mathbf{x}_j = \lambda_j \mathbf{x}_j = 0 \cdot \mathbf{x}_1 + \cdots + \lambda_j \cdot \mathbf{x}_j + \cdots + 0 \cdot \mathbf{x}_n. \]

따라서 \(j\) 번째 열은 \(j\) 번째 자리에만 \(\lambda_j\) 가 있고 나머지는 모두 0 이다. 새 행렬은 정확히 대각 행렬

\[ \Lambda = \mathrm{diag}(\lambda_1, \ldots, \lambda_n) \]

이다. 이 결과를 좌표 변환으로 적으면 \(S^{-1} A S = \Lambda\) 가 되며, 여기서 \(S\) 는 고유벡터들을 열로 쌓은 행렬이다.

직관: 왜 고유벡터 기저가 “최선” 인가

표준 기저에서 보면 \(A\) 가 벡터를 늘이고 회전시키고 섞는다. 그런데 고유벡터 기저에서 보면 \(A\) 는 각 좌표축을 자기 축 위에서만 늘이거나 줄인다 — 축들 사이가 섞이지 않는다. 변환이 \(n\) 개의 1차원 변환으로 분리된 셈이다. 단순함의 척도로 “결합 항이 없다” 는 것보다 더 강한 것은 없다.

2.1 작은 예: 사영의 두 얼굴

\(y = -x\) 위로의 사영을 보자.

\[ A = \begin{bmatrix} 0.5 & -0.5 \\ -0.5 & 0.5 \end{bmatrix}. \]

표준 기저에서 본 모양이다. 사영의 핵심 성질 \(A^2 = A\) 가 보이긴 하지만 대각이 아니므로 한눈에 들어오지 않는다.

이제 고유벡터를 구한다. \(\mathbf{x}_1 = (1, -1)\)\(y=-x\) 선 위에 있어 \(A\mathbf{x}_1 = \mathbf{x}_1\) (\(\lambda_1 = 1\)), \(\mathbf{x}_2 = (1, 1)\) 은 그 선과 수직이라 \(A\mathbf{x}_2 = \mathbf{0}\) (\(\lambda_2 = 0\)). 두 고유벡터를 기저로 잡으면

\[ \Lambda = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix}. \]

이것이 사영의 본모습이다 — “선 위 성분은 그대로, 수직 성분은 죽인다.” \(A^2=A\) 라는 성질도 \(\Lambda^2 = \Lambda\) (각 대각 원소가 0 또는 1) 에서 자명하게 보인다.

이제 대각이 아닌 다른 기저, 예를 들어 \(\mathbf{w}_1 = (2, 0)\), \(\mathbf{w}_2 = (1, 1)\) 을 잡으면 어떤 행렬이 나오는지 §7.2 의 레시피와 \(W^{-1}AW\) 두 가지 방식으로 확인하자. \(T(\mathbf{w}_1) = (1, -1) = \mathbf{w}_1 - \mathbf{w}_2\), \(T(\mathbf{w}_2) = (0, 0)\) 이므로

\[ B = \begin{bmatrix} 1 & 0 \\ -1 & 0 \end{bmatrix}. \]

같은 결과가 \(W^{-1} A W\) 로도 나온다 (\(W\) 의 열은 \(\mathbf{w}_1, \mathbf{w}_2\)). \(A\), \(B\), \(\Lambda\) 는 모두 서로 유사하며 고유값 \(1\), \(0\) 을 공유한다. 그리고 사영의 정체성 \(A^2 = A\) 는 어떤 기저에서도 보존된다 (\(B^2 = B\), \(\Lambda^2 = \Lambda\)).

2.2 실패 사례 — 왜 두 번째 길이 필요한가

한 기저로의 대각화는 강력하지만 보편적이지 않다. 첫째, \(A\) 가 정사각이어야 한다. 둘째, \(n\) 개의 선형 독립 고유벡터가 있어야 한다. \(A = \begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix}\) 같은 결손(defective) 행렬은 고유벡터가 1개뿐이라 \(S\) 자체를 만들 수 없다. 더 결정적으로, 데이터 행렬은 거의 항상 직사각이다. \(1{,}000\) 개 표본에 \(50\) 개 특성을 가진 데이터는 \(1000 \times 50\) 모양이며, 이때 “고유값” 이라는 단어는 정의조차 어렵다.

이 두 한계를 한꺼번에 푸는 것이 두 번째 길이다.


3 두 번째 길: \(U^{-1}AV = \Sigma\) — 두 정규직교 기저로 대각화 (SVD)

이제 입력 공간과 출력 공간이 다를 수 있다고 하자: \(A : \mathbb{R}^n \to \mathbb{R}^m\). 입력 기저를 \(\mathbf{v}_1, \ldots, \mathbf{v}_n\), 출력 기저를 \(\mathbf{u}_1, \ldots, \mathbf{u}_m\) 으로 잡되 두 기저 모두 정규직교 라 하자. 이 자유도를 가지면 행렬을 다시 단순하게 만들 수 있을까?

답은 “그렇다” 이고, 그 결과가 SVD 이다. 핵심은 한 줄이다.

\[ A \mathbf{v}_j = \begin{cases} \sigma_j \mathbf{u}_j & (j \le r) \\ \mathbf{0} & (j > r) \end{cases} \]

여기서 \(r = \operatorname{rank}(A)\), \(\sigma_1 \ge \sigma_2 \ge \cdots \ge \sigma_r > 0\). §7.2 의 레시피를 그대로 적용하자. 새 행렬의 \(j\) 번째 열은 \(A\mathbf{v}_j\)\(\mathbf{u}\) 기저로 분해한 계수다. \(j \le r\) 일 때 \(A\mathbf{v}_j = \sigma_j \mathbf{u}_j\) 이므로 \(j\) 번째 자리에 \(\sigma_j\), 나머지는 0. \(j > r\) 이면 모두 0. 결과는

\[ \Sigma = \begin{bmatrix} \sigma_1 & & & 0 & \cdots & 0 \\ & \ddots & & & & \\ & & \sigma_r & & & \\ \hline 0 & \cdots & 0 & 0 & \cdots & 0 \end{bmatrix}. \]

이것이 \(A\) 가 가질 수 있는 가장 단순한 모습이다. 표준 기저에서 본 \(A\) 와 두 직교 기저에서 본 \(\Sigma\) 의 관계는 좌표 변환으로 적으면

\[ \Sigma = U^{-1} A V = U^\top A V \quad \Longleftrightarrow \quad A = U \Sigma V^\top. \]

\(U^{-1} = U^\top\) 이 되는 것은 \(U\) 의 열들이 정규직교이기 때문이고, 이것은 \(U\) 의 열들이 대칭 행렬 \(A A^\top\) 의 고유벡터로 잡혔기 때문이다. 마찬가지로 \(V\)\(A^\top A\) 의 고유벡터들을 모은 직교 행렬이다. 두 대칭 행렬의 고유값이 모두 \(\sigma_j^2\) 이라는 사실(6.7 절에서 증명)이 두 기저를 한 식으로 묶는다.

두 길의 관계

\(A\)정규(normal) 행렬, 즉 \(A^\top A = A A^\top\) 이면 두 길이 거의 같아진다. 그러면 \(\Sigma = |\Lambda|\) — 즉 \(\sigma_j = |\lambda_j|\) — 가 된다. 대칭, 반대칭, 직교 행렬이 이 부류에 속한다. 그 외의 일반 행렬에서는 두 길이 정말로 다른 답을 준다.

3.1 왜 데이터 사이언스에서 SVD 가 핵심인가

분야 SVD 의 역할 구체적 사용
차원 축소 \(\sigma\) 만 남기면 최선의 저랭크 근사 PCA = \(A^\top A\) 의 고유분해 = \(A\) 의 SVD
추천 시스템 사용자 × 아이템 행렬을 잠재 요인 두 행렬로 분해 Netflix Prize, latent factor models
잠재 의미 분석 단어 × 문서 행렬에서 의미 축 추출 LSA, 토픽 모델
노이즈 제거 작은 \(\sigma\) 에 들어 있는 성분을 잘라냄 이미지·신호 압축
수치 안정성 조건수 \(\sigma_1 / \sigma_r\) 로 ill-conditioning 진단 회귀, 역문제

핵심은 SVD 가 단순히 한 분해 공식이 아니라 모든 행렬에 항상 존재하는 표준형 이라는 점이다. “고유값 분해” 가 통하지 않는 직사각·결손 행렬에서도 SVD 는 끝까지 작동한다.


4 극분해: \(A = QH\)

SVD 에서 한 줄만 더 가면 또 하나의 표준 분해가 나온다. \(V^\top V = I\) 를 SVD 의 가운데에 끼워 넣자.

\[ A = U \Sigma V^\top = \underbrace{(U V^\top)}_{Q} \underbrace{(V \Sigma V^\top)}_{H} = Q H. \]

여기서

  • \(Q = U V^\top\) — 두 직교 행렬의 곱은 다시 직교다 (회전 또는 회전 + 반사)
  • \(H = V \Sigma V^\top\) — 대칭이고, 고유값이 \(\sigma_j \ge 0\) 이므로 양반정부호(positive semidefinite). \(A\) 가 가역이면 \(\sigma_j > 0\) 이라 양정부호.

이것이 극분해(polar decomposition) \(A = QH\) 이다. 한 줄짜리 직관이 깊다.

직관: 회전과 늘이기의 분리

복소수의 극형식 \(z = r e^{i\theta}\) 에서 \(r \ge 0\) 은 크기, \(e^{i\theta}\) 는 단위원 위 회전이다. 행렬판은 \(A = QH\)\(H\) 는 늘이기·줄이기(고유값이 \(\sigma_j\)), \(Q\) 는 그 늘인 결과를 회전시킨다. 강체가 변형될 때 어디까지가 회전이고 어디까지가 변형인지를 분리하는 도구로 연속체 역학에서 정확히 이 분해가 쓰인다.

극분해는 SVD 의 핵심 식 \(A \mathbf{v}_i = \sigma_i \mathbf{u}_i\) 를 두 단계로 분리한 것으로 읽을 수도 있다.

  1. \(H \mathbf{v}_i = \sigma_i \mathbf{v}_i\)\(\mathbf{v}_i\) 를 같은 방향으로 \(\sigma_i\) 배 늘인다.
  2. \(Q (\sigma_i \mathbf{v}_i) = \sigma_i \mathbf{u}_i\) — 그 결과를 \(\mathbf{u}_i\) 방향으로 회전시킨다.

순서를 뒤집은 \(A = K Q\) 도 존재한다. 이때 \(K = U \Sigma U^\top\)\(A A^\top\) 의 양반정부호 제곱근이다.


5 의사역행렬: \(A^+ = V \Sigma^+ U^\top\)

이제 SVD 의 마지막 선물을 받는다.

가역 행렬 \(A\) 의 역행렬은 무엇을 하는가? \(A \mathbf{v}_i = \sigma_i \mathbf{u}_i\) 를 거꾸로 한다 — \(A^{-1} \mathbf{u}_i = \mathbf{v}_i / \sigma_i\). 즉 두 기저의 역할이 바뀐다.

가역이 아닐 때는 어떨까? 그래도 “거꾸로 한다” 는 일은 부분적으로 가능하다. 적어도 열공간 안의 벡터 \(\mathbf{u}_1, \ldots, \mathbf{u}_r\) 는 행공간의 \(\mathbf{v}_1, \ldots, \mathbf{v}_r\) 로 되돌릴 수 있다. 좌영공간 안의 \(\mathbf{u}_{r+1}, \ldots, \mathbf{u}_m\)\(A\) 에 의해 도달된 적이 없으므로 0 으로 보낸다. 이 규칙을 한 행렬로 묶은 것이 의사역행렬이다.

정의: 의사역행렬 (Moore–Penrose Pseudoinverse)

\(A = U \Sigma V^\top\) 의 의사역행렬은

\[ A^+ = V \Sigma^+ U^\top \]

이다. 여기서 \(\Sigma^+\)\(\Sigma\) 의 0 이 아닌 대각 원소 \(\sigma_j\) 를 모두 \(1/\sigma_j\) 로 바꾸고 모양은 전치한 \(n \times m\) 행렬이다. 즉

\[ A^+ \mathbf{u}_i = \begin{cases} \mathbf{v}_i / \sigma_i & (i \le r) \\ \mathbf{0} & (i > r) \end{cases} \]

이 성립한다.

식 자체는 가역의 경우와 거의 같다 — \(A^{-1} = V \Sigma^{-1} U^\top\)\(A^+ = V \Sigma^+ U^\top\) 는 모양이 동일하다. 차이는 \(\sigma_j = 0\) 인 자리에서 \(1/0\) 을 쓰는 대신 그냥 0 을 쓴다는 것뿐이다. 할 수 있는 만큼만 한다 는 정신이다.

5.1 네 부분 공간 그림

\(A^+\) 의 정체는 네 부분 공간 그림으로 가장 명확하게 드러난다 (Strang 의 그림 7.4).

\(A\) 의 작용 \(A^+\) 의 작용
행공간 열공간으로 가져감 (\(\sigma_i\) 배) (출력 — \(A^+\) 가 도착하는 곳)
열공간 (출력 — \(A\) 가 도착하는 곳) 행공간으로 되돌림 (\(1/\sigma_i\) 배)
영공간 0 으로 보냄 (출력에 영향 없음)
좌영공간 (입력에 등장 안 함) 0 으로 보냄

이로부터 두 가지 중요한 성질이 나온다.

\[ A A^+ = U_r U_r^\top = (\text{열공간으로의 정규직교 사영}) \]

\[ A^+ A = V_r V_r^\top = (\text{행공간으로의 정규직교 사영}) \]

여기서 \(U_r\), \(V_r\) 은 처음 \(r\) 개의 좌·우 특이벡터를 모은 행렬이다. 역행렬과 가장 가까운 것 의 의미가 이것으로 분명해진다 — \(A^+\) 는 단위행렬을 만들지는 못하지만, 만들 수 있는 가장 단위행렬에 가까운 것(=가장 큰 부분 공간 위의 항등) 을 만든다.

5.2 두 가지 특수 경우

상황 가정 공식
열 풀랭크 \(\operatorname{rank}(A) = n\) (\(A^\top A\) 가역) \(A^+ = (A^\top A)^{-1} A^\top\) — 좌역행렬, \(A^+ A = I_n\)
행 풀랭크 \(\operatorname{rank}(A) = m\) (\(A A^\top\) 가역) \(A^+ = A^\top (A A^\top)^{-1}\) — 우역행렬, \(A A^+ = I_m\)
둘 다 풀랭크(=정사각 가역) \(m = n = r\) \(A^+ = A^{-1}\)
둘 다 결손 \(r < \min(m, n)\) SVD 를 거쳐 \(A^+ = V \Sigma^+ U^\top\)

세 번째 행이 중요하다. 정사각이고 가역이라면 \(A^+\) 는 보통의 역행렬과 정확히 일치한다 — 새 개념이 익숙한 개념의 일반화임을 보장하는 안전장치다.

5.3 작은 예: 랭크 1 행렬

\[ A = \begin{bmatrix} 2 & 2 \\ 1 & 1 \end{bmatrix}, \quad \operatorname{rank}(A) = 1. \]

두 열이 같은 방향이므로 가역이 아니다. 그러나 SVD 는 잘 정의된다. 단 하나의 특이값은 \(\sigma_1 = \sqrt{10}\) 이고, SVD 를 통해

\[ A^+ = V \Sigma^+ U^\top = \frac{1}{10} \begin{bmatrix} 2 & 1 \\ 2 & 1 \end{bmatrix}. \]

확인: \(A\) 가 행공간의 \((1, 1)\) 을 열공간의 \((4, 2)\) 로 보낸다면, \(A^+\)\((4, 2)\) 를 다시 \((1, 1)\) 로 되돌린다.

\[ A^+ \begin{bmatrix} 4 \\ 2 \end{bmatrix} = \frac{1}{10} \begin{bmatrix} 2 \cdot 4 + 1 \cdot 2 \\ 2 \cdot 4 + 1 \cdot 2 \end{bmatrix} = \begin{bmatrix} 1 \\ 1 \end{bmatrix}. \;\checkmark \]

5.4 일반 공식: 랭크 1 의 미니어처

모든 랭크 1 행렬은 \(A = \sigma \mathbf{u} \mathbf{v}^\top\) 형태이고 (단위 벡터 \(\mathbf{u}\), \(\mathbf{v}\)), 의사역행렬도 같은 모양이다.

\[ A^+ = \frac{\mathbf{v} \mathbf{u}^\top}{\sigma}. \]

이를 곱해 보면 \(A A^+ = \mathbf{u} \mathbf{u}^\top\) (열공간 직선 위로의 사영), \(A^+ A = \mathbf{v} \mathbf{v}^\top\) (행공간 직선 위로의 사영) — 위의 일반 사실의 가장 작은 확인 사례다.


6 최소제곱과의 연결

이 절의 가장 실용적인 결말은 최소제곱법 과의 연결이다.

Ch.4 는 풀 수 없는 시스템 \(A \mathbf{x} = \mathbf{b}\) 에 대해 정규방정식 \(A^\top A \widehat{\mathbf{x}} = A^\top \mathbf{b}\) 를 풀어 최선의 해 \(\widehat{\mathbf{x}}\) 를 찾았다. 그러나 그 논의는 한 가정에 의존했다 — \(A^\top A\) 가 가역이어야 한다, 즉 \(A\) 의 열들이 독립이어야 한다.

이 가정이 깨지면 어떻게 되는가? 정규방정식에 해가 무한히 많아진다. 실험 데이터에서 변수들이 서로 강하게 종속이거나(다중공선성), 변수가 표본보다 많을 때(고차원 회귀)가 정확히 이 상황이다.

정리: 최단 최소제곱해

\(A \mathbf{x} = \mathbf{b}\) 의 정규방정식이 여러 해를 가질 때, 그 해들 중 노름이 가장 작은 것은

\[ \mathbf{x}^+ = A^+ \mathbf{b} \]

이다.

이것이 의사역행렬의 통계적 의미다. 다른 정규방정식 해 \(\widehat{\mathbf{x}}\) 가 있다면 그것은 \(\mathbf{x}^+\) 에 영공간 벡터를 더한 것 (\(\widehat{\mathbf{x}} = \mathbf{x}^+ + \mathbf{n}\), \(\mathbf{n} \in N(A)\)). 의사역행렬은 그 자유도를 영공간 방향으로는 0 으로 잘라 — 즉 행공간 안에 머무르는 해를 골라 — 가장 짧은 해를 만든다. 사용자가 별도로 정규화 항을 넣지 않아도 자동으로 minimum-norm 해를 주는 셈이다.

머신러닝 맥락에서 이것은 릿지 회귀의 극한 으로도 읽을 수 있다. \(\widehat{\mathbf{x}}_\lambda = (A^\top A + \lambda I)^{-1} A^\top \mathbf{b}\)\(\lambda \to 0^+\) 극한이 정확히 \(A^+ \mathbf{b}\) 가 된다. 정칙화 강도를 0 으로 보내면 의사역행렬이 자연스럽게 등장한다는 사실은 의사역행렬이 얼마나 깊게 통계와 얽혀 있는지를 보여준다.


7 응용 분야

분야 활용 구체적 예시
통계학 다중공선성이 있는 회귀 \(\mathbf{x}^+ = A^+ \mathbf{b}\), minimum-norm OLS
머신러닝 과소결정 시스템의 closed-form 해 \(p \gg n\) 회귀, 커널 머신
컴퓨터 비전 호모그래피·기본행렬 추정 잡음 있는 점 대응에서 SVD + 의사역행렬
추천 시스템 결측 행렬의 저랭크 복원 SVD truncation, 알고리즘적 의사역
제어공학 입력이 출력보다 적은 시스템 의사역행렬로 가장 짧은 제어 입력 계산
로봇공학 잉여 자유도 역기구학 야코비안의 의사역행렬
연속체 역학 변형 분해 극분해 \(F = QH\) 로 회전·변형 분리

추상적으로 보이는 §7.3 의 결과들이 실무에서 거의 매일 쓰인다는 사실에 주목할 만하다. 특히 데이터가 많아질수록 (그리고 특성이 그보다 더 빨리 늘어날수록) 풀랭크 가정이 깨지는 경우가 일상이 되며, 그때 자연스럽게 등장하는 도구가 의사역행렬이다.


8 코드 예시

8.1 Step 1: 두 길의 대각화 비교

import numpy as np

# 사영 행렬 — y = -x 위로
A = np.array([[0.5, -0.5],
              [-0.5, 0.5]])

# 길 1: 고유값 분해 (한 기저)
eigvals, S = np.linalg.eig(A)
Lambda = np.diag(eigvals)
print("Eigenvalues  :", eigvals)                       # [1, 0]
print("S^{-1} A S   :\n", np.linalg.inv(S) @ A @ S)    # = Lambda

# 길 2: SVD (두 기저)
U, sigma, Vt = np.linalg.svd(A)
Sigma = np.diag(sigma)
print("Singular vals:", sigma)                          # [1, 0]
print("U^T A V      :\n", U.T @ A @ Vt.T)               # = Sigma

# 사영은 A^T A = A A^T 인 정규 행렬이라 두 길의 결과가 일치
# 일반 행렬에서는 그렇지 않다

8.2 Step 2: 직사각 행렬의 SVD 와 의사역행렬

import numpy as np

# 의도적으로 직사각·랭크 결손
A = np.array([[2.0, 2.0],
              [1.0, 1.0]])
print("rank =", np.linalg.matrix_rank(A))               # 1

# SVD
U, sigma, Vt = np.linalg.svd(A, full_matrices=True)
print("singular values:", sigma)                        # [sqrt(10), 0]

# 손으로 만든 의사역행렬
Sigma_plus = np.zeros((A.shape[1], A.shape[0]))
for i, s in enumerate(sigma):
    if s > 1e-12:
        Sigma_plus[i, i] = 1.0 / s
A_plus_manual = Vt.T @ Sigma_plus @ U.T

# numpy 의 pinv 와 비교
A_plus_np = np.linalg.pinv(A)
print("manual:\n", A_plus_manual)
print("pinv  :\n", A_plus_np)
print("max diff:", np.max(np.abs(A_plus_manual - A_plus_np)))

# 핵심 성질 확인
print("A A^+ (열공간 사영):\n", A @ A_plus_np)
print("A^+ A (행공간 사영):\n", A_plus_np @ A)

8.3 Step 3: 최소제곱 minimum-norm 해

import numpy as np

# 과소결정 시스템: 변수 3개, 방정식 2개 — 해가 무한히 많음
A = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 0.0])

# 의사역행렬을 통한 minimum-norm 해
x_plus = np.linalg.pinv(A) @ b
print("x+      :", x_plus)
print("||x+||  :", np.linalg.norm(x_plus))
print("Ax+ - b :", A @ x_plus - b)                     # ~ 0

# 같은 시스템을 푸는 다른 해는 영공간 벡터를 더한 것
# 그 중 가장 짧은 것이 x+
ns = np.linalg.svd(A)[2][-1]                            # 영공간의 한 단위 벡터
for t in [-2, -1, 0, 1, 2]:
    x_alt = x_plus + t * ns
    print(f"t={t:+}: ||x||={np.linalg.norm(x_alt):.4f}, "
          f"||Ax-b||={np.linalg.norm(A@x_alt - b):.2e}")
# t=0 일 때 노름이 최소 — 다른 t 도 정규방정식은 똑같이 만족

8.4 Step 4 (선택): 극분해

import numpy as np

A = np.array([[2.0, 2.0],
              [-1.0, 1.0]])

U, sigma, Vt = np.linalg.svd(A)
Q = U @ Vt                                              # 회전 부분
H = Vt.T @ np.diag(sigma) @ Vt                          # 늘이기 부분

print("Q (직교?):\n", Q)
print("Q^T Q   :\n", Q.T @ Q)                           # ~ I
print("H (대칭?):\n", H)
print("max(H - H^T):", np.max(np.abs(H - H.T)))         # ~ 0
print("QH 복원 :\n", Q @ H)
print("== A ?  :", np.allclose(Q @ H, A))               # True

9 정리

§7.3 의 핵심을 간추리면 다음과 같다.

  • 좋은 기저가 좋은 행렬을 만든다. 가장 단순한 행렬은 대각이며, 그 길은 두 가지다.
  • 첫째 길 \(S^{-1} A S = \Lambda\) — 같은 기저(고유벡터)로의 대각화. 정사각이고 \(n\) 개의 독립 고유벡터가 있을 때만 가능. 가능할 때는 변환을 \(n\) 개의 1차원 늘이기로 분리한다.
  • 둘째 길 \(U^{-1} A V = \Sigma\) — 두 정규직교 기저(특이벡터)로의 대각화. 모든 행렬 에 대해 항상 존재한다. 직사각·결손 행렬에서도 끝까지 작동한다.
  • 극분해 \(A = QH\) 는 SVD 의 직접적 따름정리로, 변환을 회전(\(Q\))과 늘이기(\(H\))로 분리한다.
  • 의사역행렬 \(A^+ = V \Sigma^+ U^\top\) 은 SVD 의 가장 실용적인 결말이다. 역행렬이 없을 때조차 열공간을 행공간으로 되돌려보내는 합리적 역할을 맡고, \(A A^+\), \(A^+ A\) 는 정규직교 사영이 된다.
  • 그 통계적 의미는 한 줄이다 — \(\mathbf{x}^+ = A^+ \mathbf{b}\)\(A \mathbf{x} = \mathbf{b}\)최단 최소제곱해 이다. 정규방정식의 해가 여러 개일 때 영공간 자유도를 자동으로 잘라 minimum-norm 해를 골라 준다.

이로써 §7.1 (선언), §7.2 (구성), §7.3 (단순화 + 일반화) 의 흐름이 닫힌다. 다음 단계는 이 분해들이 실제 데이터 분석 — PCA, 회귀, 잠재 요인 모델 — 에서 어떻게 자라나는지를 보는 일이다.


10 관련 주제

선행 지식

후속 주제

다른 카테고리 연결


11 참고문헌

  • Strang, G. (2009). Introduction to Linear Algebra (4th ed.), Ch. 7 §7.3. Wellesley-Cambridge Press.
  • Golub, G. H., & Van Loan, C. F. (2013). Matrix Computations (4th ed.), Ch. 5–6. Johns Hopkins University Press.
  • Penrose, R. (1955). A generalized inverse for matrices. Mathematical Proceedings of the Cambridge Philosophical Society, 51(3), 406–413.

Subscribe

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