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\) 를 두 단계로 분리한 것으로 읽을 수도 있다.
- \(H \mathbf{v}_i = \sigma_i \mathbf{v}_i\) — \(\mathbf{v}_i\) 를 같은 방향으로 \(\sigma_i\) 배 늘인다.
- \(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 으로 보낸다. 이 규칙을 한 행렬로 묶은 것이 의사역행렬이다.
\(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)) # True9 정리
§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 관련 주제
선행 지식
후속 주제
다른 카테고리 연결
- 릿지·라쏘 회귀 — 풀랭크 가정이 깨질 때의 회귀
- 추천 시스템의 행렬 분해 — SVD 의 산업적 활용
- 선형 회귀의 기하학 — \(A A^+\) 가 사영이라는 사실의 통계적 해석
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.