1 이 절의 위치
§4.1에서 “행렬의 네 부분공간이 두 쌍의 직교 보공간을 이룬다”는 사실을 증명했다. §4.2는 이 직교성을 실제 계산 도구로 바꾼다.
§4.1 네 부분공간의 직교성
↓ "잔차가 열공간에 수직"이라는 조건을 도구화하면
§4.2 투영 (Projection) ← 지금 여기
↓ "오차를 최소화하는 해"를 직접 구하면
§4.3 최소제곱법 (Least Squares)
↓ "투영이 더 쉬워지는 기저"를 만들면
§4.4 Gram-Schmidt & QR 분해
§4.2의 핵심 질문은 다음 하나다.
“\(\mathbf{b}\) 가 \(C(\mathbf{A})\) 밖에 있을 때, \(C(\mathbf{A})\) 안에서 \(\mathbf{b}\) 에 가장 가까운 점은 무엇인가?”
2 왜 투영이 필요한가
2.1 해가 없는 \(\mathbf{A}\mathbf{x} = \mathbf{b}\)
실제 데이터 분석에서는 방정식이 미지수보다 많은 상황 (\(m \gg n\))이 흔하다. 측정값은 노이즈가 섞여있고, 모델은 단순해서 데이터를 완벽히 통과하는 \(\mathbf{x}\) 가 존재하지 않는다.
\(\mathbf{b}\) 가 \(C(\mathbf{A})\) 밖에 있으면 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 는 해가 없다. 그렇다면 질문을 바꾼다.
“\(\mathbf{b}\) 에 가장 가까운 \(C(\mathbf{A})\) 의 점 \(\mathbf{p}\) 는 무엇인가?”
이 \(\mathbf{p}\) 가 \(\mathbf{b}\) 의 투영(projection)이다. 그리고 \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\) 를 만족하는 \(\hat{\mathbf{x}}\) 가 “최선의 근사해”이다.
2.2 직관: 그림자와 수선의 발
평면 위의 한 점에서 땅에 수선을 내리면, 수선의 발이 그 점의 “투영”이다. 수선이 땅과 직각을 이루는 것이 결정적이다 — 이것이 “가장 가까움”을 보장한다.
고차원에서도 똑같다. 한 벡터 \(\mathbf{b}\) 에서 부분공간에 수선을 내리면, 그 발이 \(\mathbf{p}\) 이고, 오차 \(\mathbf{e} = \mathbf{b} - \mathbf{p}\) 는 부분공간에 수직이다.
3 직관 체크: 축으로의 투영
본격적 공식 유도 전에, 가장 쉬운 경우부터 본다.
\(\mathbb{R}^3\) 의 벡터 \(\mathbf{b} = (2, 3, 4)^\top\) 를 \(z\) 축과 \(xy\) 평면 위로 투영하면:
- \(z\) 축 위로: \(\mathbf{p}_1 = (0, 0, 4)^\top\) — \(z\) 성분만 남긴다
- \(xy\) 평면 위로: \(\mathbf{p}_2 = (2, 3, 0)^\top\) — \(x, y\) 성분만 남긴다
두 투영의 투영 행렬은 각각:
\[\mathbf{P}_1 = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}, \quad \mathbf{P}_2 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix}\]
관찰: - \(\mathbf{P}_1 + \mathbf{P}_2 = \mathbf{I}\) (두 투영이 서로 직교 보공간으로 쪼갠다) - \(\mathbf{p}_1 + \mathbf{p}_2 = \mathbf{b}\) (원래 벡터가 두 성분의 합) - 각 \(\mathbf{P}_i\) 는 대칭: \(\mathbf{P}_i^\top = \mathbf{P}_i\) - 각 \(\mathbf{P}_i\) 는 멱등: \(\mathbf{P}_i^2 = \mathbf{P}_i\) (한 번 투영한 것을 또 투영해도 같다)
이 특별한 경우는 \(z\) 축과 \(xy\) 평면이 이미 좌표축에 정렬되어 있어 행렬이 단순하다. 일반적인 부분공간에서는 더 복잡한 공식이 필요하다.
import numpy as np
import matplotlib.pyplot as plt
# 좌표축 투영 예시
b = np.array([2, 3, 4])
P1 = np.array([[0, 0, 0],
[0, 0, 0],
[0, 0, 1]]) # z축 투영
P2 = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 0]]) # xy평면 투영
p1 = P1 @ b
p2 = P2 @ b
print(f"b = {b}")
print(f"p1 = {p1} (z축 투영)")
print(f"p2 = {p2} (xy평면 투영)")
print(f"p1 + p2 = {p1 + p2} ✓")
print(f"P1 + P2 =\n{P1 + P2} (= 단위행렬)")
# 멱등성·대칭성 확인
print(f"\nP1² = P1: {np.array_equal(P1 @ P1, P1)}")
print(f"P1ᵀ = P1: {np.array_equal(P1.T, P1)}")4 직선 위로의 투영 (1차원 경우)
4.1 문제 설정
\(\mathbb{R}^m\) 의 벡터 \(\mathbf{a}\) 가 만드는 직선 \(L = \{t\mathbf{a} \mid t \in \mathbb{R}\}\) 위로 \(\mathbf{b}\) 를 투영한다. 투영 벡터 \(\mathbf{p}\) 는 직선 위의 어떤 점이므로 \(\mathbf{p} = \hat{x}\mathbf{a}\) 형태다. 남은 과제: 스칼라 \(\hat{x}\) 를 구하는 것.
4.2 핵심 조건: 오차가 직선에 수직
오차 벡터 \(\mathbf{e} = \mathbf{b} - \mathbf{p} = \mathbf{b} - \hat{x}\mathbf{a}\) 가 \(\mathbf{a}\) 에 수직이어야 한다.
왜 “수직일 때가 가장 가까운가”: 직선 위의 다른 점 \(t\mathbf{a}\) 로 이동하면 수직 성분은 그대로 남고 수평 성분만 길어진다. 따라서 수직 성분 = 오차가 최소가 되는 점은 수평 성분이 0일 때, 즉 오차가 수직일 때뿐이다. 이것이 피타고라스 정리의 기하학적 표현이다.
4.3 공식 유도
수직 조건을 대수로 쓰면:
\[\mathbf{a}^\top (\mathbf{b} - \hat{x}\mathbf{a}) = 0\]
전개:
\[\mathbf{a}^\top \mathbf{b} - \hat{x} \, \mathbf{a}^\top \mathbf{a} = 0\]
핵심 유도:
\[\boxed{\hat{x} = \frac{\mathbf{a}^\top \mathbf{b}}{\mathbf{a}^\top \mathbf{a}}}\]
따라서 투영 벡터는:
\[\boxed{\mathbf{p} = \hat{x}\mathbf{a} = \frac{\mathbf{a}^\top \mathbf{b}}{\mathbf{a}^\top \mathbf{a}} \, \mathbf{a}}\]
4.4 두 극단 경우로 공식 검증
경우 1: \(\mathbf{b} = \mathbf{a}\) 이면 \(\hat{x} = \mathbf{a}^\top \mathbf{a} / \mathbf{a}^\top \mathbf{a} = 1\), 따라서 \(\mathbf{p} = \mathbf{a}\). \(\mathbf{a}\) 를 자기 자신이 만든 직선에 투영하면 자기 자신 — 당연하다.
경우 2: \(\mathbf{b} \perp \mathbf{a}\) 이면 \(\mathbf{a}^\top \mathbf{b} = 0\), 따라서 \(\hat{x} = 0, \mathbf{p} = \mathbf{0}\). \(\mathbf{a}\) 에 수직인 벡터의 그림자는 원점 — 당연하다.
4.5 삼각법과의 연결
직각삼각형 관점에서 보면, \(\mathbf{b}, \mathbf{p}, \mathbf{e}\) 는 직각삼각형의 세 변이다. 빗변이 \(\mathbf{b}\), 수평 변이 \(\mathbf{p}\), 수직 변이 \(\mathbf{e}\).
\[\|\mathbf{p}\| = \|\mathbf{b}\| \cos\theta\]
여기서 \(\cos\theta = \mathbf{a}^\top \mathbf{b} / (\|\mathbf{a}\| \|\mathbf{b}\|)\) (내적 정의에서). 대입하면:
\[\|\mathbf{p}\| = \|\mathbf{b}\| \cdot \frac{\mathbf{a}^\top \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} = \frac{\mathbf{a}^\top \mathbf{b}}{\|\mathbf{a}\|}\]
공식 \(\mathbf{p} = (\mathbf{a}^\top \mathbf{b} / \mathbf{a}^\top \mathbf{a})\mathbf{a}\) 의 길이를 계산하면 \(\mathbf{a}^\top \mathbf{b} / \|\mathbf{a}\|\) 와 일치한다.
직관: 내적이 \(\|\mathbf{b}\|\cos\theta\) 의 일반화이므로, 투영은 “코사인 길이”를 자연스럽게 추출한다.
4.6 예시: \(\mathbf{b} = (1,1,1)^\top\), \(\mathbf{a} = (1,2,2)^\top\)
\[\mathbf{a}^\top \mathbf{b} = 1 + 2 + 2 = 5, \quad \mathbf{a}^\top \mathbf{a} = 1 + 4 + 4 = 9\]
\[\hat{x} = \frac{5}{9}, \quad \mathbf{p} = \frac{5}{9}\begin{bmatrix} 1 \\ 2 \\ 2 \end{bmatrix} = \begin{bmatrix} 5/9 \\ 10/9 \\ 10/9 \end{bmatrix}\]
오차:
\[\mathbf{e} = \mathbf{b} - \mathbf{p} = \begin{bmatrix} 1 - 5/9 \\ 1 - 10/9 \\ 1 - 10/9 \end{bmatrix} = \begin{bmatrix} 4/9 \\ -1/9 \\ -1/9 \end{bmatrix}\]
수직성 검증: \(\mathbf{e}^\top \mathbf{a} = 4/9 - 2/9 - 2/9 = 0\) ✓
a = np.array([1, 2, 2], dtype=float)
b = np.array([1, 1, 1], dtype=float)
# 공식으로 투영 계산
x_hat = (a @ b) / (a @ a)
p = x_hat * a
e = b - p
print("=== 직선 위로의 투영 ===")
print(f"â = aᵀb / aᵀa = {a @ b}/{a @ a} = {x_hat:.4f}")
print(f"p = â·a = {p}")
print(f"e = b - p = {e}")
print(f"\n수직성 검증: eᵀa = {e @ a:.10f}") # 0
print(f"길이 검증: ‖b‖² = ‖p‖² + ‖e‖²")
print(f" ‖b‖² = {b @ b:.4f}")
print(f" ‖p‖² + ‖e‖² = {p @ p + e @ e:.4f}")5 투영 행렬 \(\mathbf{P}\) (1차원)
5.1 유도
투영 공식 \(\mathbf{p} = (\mathbf{a}^\top \mathbf{b} / \mathbf{a}^\top \mathbf{a})\mathbf{a}\) 에서 \(\mathbf{b}\) 를 밖으로 빼내기 위해, 분자의 스칼라 \(\mathbf{a}^\top \mathbf{b}\) 를 “\(\mathbf{a}\) 옆으로” 옮긴다.
\[\mathbf{p} = \mathbf{a} \cdot \frac{\mathbf{a}^\top \mathbf{b}}{\mathbf{a}^\top \mathbf{a}} = \frac{\mathbf{a}\mathbf{a}^\top}{\mathbf{a}^\top \mathbf{a}} \, \mathbf{b}\]
따라서 직선 위로의 투영 행렬은:
\[\boxed{\mathbf{P} = \frac{\mathbf{a}\mathbf{a}^\top}{\mathbf{a}^\top \mathbf{a}}}\]
5.2 구조 관찰: “열 × 행” = 랭크 1 행렬
\(\mathbf{a}\) 는 \(m \times 1\) 열벡터, \(\mathbf{a}^\top\) 는 \(1 \times m\) 행벡터다. 곱 \(\mathbf{a}\mathbf{a}^\top\) 는 \(m \times m\) 행렬이지만 랭크는 1이다 (열공간이 \(\mathbf{a}\) 방향의 직선뿐이므로).
분모 \(\mathbf{a}^\top \mathbf{a}\) 는 스칼라 (수)이다. “수로 행렬을 나눈다”는 것이 정상화 역할을 한다.
5.3 예시: \(\mathbf{a} = (1,2,2)^\top\)
\[\mathbf{P} = \frac{1}{9}\begin{bmatrix} 1 \\ 2 \\ 2 \end{bmatrix} \begin{bmatrix} 1 & 2 & 2 \end{bmatrix} = \frac{1}{9}\begin{bmatrix} 1 & 2 & 2 \\ 2 & 4 & 4 \\ 2 & 4 & 4 \end{bmatrix}\]
확인: \(\mathbf{P}\mathbf{b} = \mathbf{p}\) 이어야 한다. \(\mathbf{b} = (1,1,1)^\top\) 에 대해:
\[\mathbf{P}\mathbf{b} = \frac{1}{9}\begin{bmatrix} 1+2+2 \\ 2+4+4 \\ 2+4+4 \end{bmatrix} = \frac{1}{9}\begin{bmatrix} 5 \\ 10 \\ 10 \end{bmatrix} = \begin{bmatrix} 5/9 \\ 10/9 \\ 10/9 \end{bmatrix}\]
앞서 구한 \(\mathbf{p}\) 와 일치 ✓
5.4 \(\mathbf{I} - \mathbf{P}\) 의 의미
\(\mathbf{P}\) 가 \(\mathbf{b}\) 의 \(\mathbf{a}\) 방향 성분을 뽑아낸다면, \(\mathbf{I} - \mathbf{P}\) 는 나머지 — 즉 \(\mathbf{a}\) 에 수직인 성분을 뽑아낸다.
\[(\mathbf{I} - \mathbf{P})\mathbf{b} = \mathbf{b} - \mathbf{P}\mathbf{b} = \mathbf{b} - \mathbf{p} = \mathbf{e}\]
핵심: \(\mathbf{I} - \mathbf{P}\) 도 투영 행렬이다 — \(\mathbf{a}\) 에 수직인 초평면 위로의 투영. 한 부분공간으로의 투영과 그 직교 보공간으로의 투영은 서로 \(\mathbf{I} - \mathbf{P}\) 관계이다.
# 투영 행렬 P 계산 및 성질 확인
a = np.array([1, 2, 2], dtype=float).reshape(-1, 1) # 열벡터
P = (a @ a.T) / (a.T @ a)
print("투영 행렬 P =")
print(P)
# 대칭성
print(f"\n대칭성: Pᵀ = P? {np.allclose(P, P.T)}")
# 멱등성
print(f"멱등성: P² = P? {np.allclose(P @ P, P)}")
# 랭크
print(f"랭크 rank(P) = {np.linalg.matrix_rank(P)}")
# 대각합 = 랭크 (투영 행렬의 성질)
print(f"tr(P) = {np.trace(P):.4f} (= 랭크)")
# I - P 도 투영 행렬
I = np.eye(3)
Q = I - P
print(f"\n(I-P)² = (I-P)? {np.allclose(Q @ Q, Q)}")
print(f"(I-P)의 랭크 = {np.linalg.matrix_rank(Q)}") # 2 (수직 평면)
print(f"P와 (I-P)의 곱: P(I-P) =\n{P @ Q}") # ≈ 0 (직교)6 부분공간 위로의 투영 (일반 경우)
6.1 문제 재설정
이제 직선이 아닌 \(n\) 차원 부분공간 위로의 투영을 다룬다. 부분공간을 \(n\) 개의 선형 독립 벡터 \(\mathbf{a}_1, \ldots, \mathbf{a}_n\) 으로 기술하고, 이 벡터들을 \(m \times n\) 행렬 \(\mathbf{A}\) 의 열로 놓는다.
그러면 부분공간 = \(C(\mathbf{A})\) 이고, 투영은 “\(\mathbf{A}\) 의 열공간 위로의 투영”이 된다.
투영 벡터는 열들의 선형결합 \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\) 형태다. 남은 과제: 벡터 \(\hat{\mathbf{x}} \in \mathbb{R}^n\) 를 구하는 것.
6.2 핵심 조건: 오차가 모든 열과 수직
오차 \(\mathbf{e} = \mathbf{b} - \mathbf{A}\hat{\mathbf{x}}\) 는 \(C(\mathbf{A})\) 전체와 수직이어야 한다. 이것은 \(\mathbf{A}\) 의 모든 열과 수직이라는 것과 동치이다 (\(C(\mathbf{A})\) 의 모든 벡터가 열들의 선형결합이므로).
\(n\) 개의 열 각각에 대해 수직 조건을 쓴다:
\[\mathbf{a}_1^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = 0, \quad \mathbf{a}_2^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = 0, \quad \ldots, \quad \mathbf{a}_n^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = 0\]
이 \(n\) 개의 방정식을 하나의 행렬 방정식으로 쓰면:
\[\begin{bmatrix} \mathbf{a}_1^\top \\ \mathbf{a}_2^\top \\ \vdots \\ \mathbf{a}_n^\top \end{bmatrix} (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = \mathbf{A}^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = \mathbf{0}\]
(각 행 \(\mathbf{a}_i^\top\) 를 쌓으면 \(\mathbf{A}^\top\) 이 된다.)
6.3 정규방정식 (Normal Equation)
전개하면:
\[\mathbf{A}^\top \mathbf{b} - \mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{0}\]
\[\boxed{\mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}}\]
이것이 그 유명한 정규방정식(Normal Equation)이다. “정규(normal)”라는 이름은 “수직(normal = perpendicular)” 조건에서 유도되었기 때문이다.
6.4 네 부분공간으로 본 두 번째 유도 (더 우아한 방식)
정규방정식을 §4.1의 결과를 이용해 한 줄로 유도할 수 있다.
- 투영하는 공간은 \(C(\mathbf{A})\) (열공간)
- 오차 \(\mathbf{e} = \mathbf{b} - \mathbf{A}\hat{\mathbf{x}}\) 는 \(C(\mathbf{A})\) 에 수직
- §4.1에 의해 \(C(\mathbf{A})^\perp = N(\mathbf{A}^\top)\) (좌영공간)
- 따라서 \(\mathbf{e} \in N(\mathbf{A}^\top)\), 즉 \(\mathbf{A}^\top \mathbf{e} = \mathbf{0}\)
- 풀어쓰면 \(\mathbf{A}^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = \mathbf{0}\) → 정규방정식
핵심 통찰: 좌영공간 \(N(\mathbf{A}^\top)\) 이 드디어 “쓸모”를 드러낸다 — 오차 벡터가 정확히 여기에 산다.
6.5 투영 공식 (최종)
\(\mathbf{A}\) 의 열이 선형 독립이면 \(\mathbf{A}^\top \mathbf{A}\) 가 가역이므로:
\[\boxed{\hat{\mathbf{x}} = (\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top \mathbf{b}}\]
\[\boxed{\mathbf{p} = \mathbf{A}\hat{\mathbf{x}} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top \mathbf{b}}\]
\[\boxed{\mathbf{P} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top}\]
6.6 1차원 경우와의 비교
| 1D (직선) | n-D (부분공간) | |
|---|---|---|
| 행렬 \(\mathbf{A}\) | 열벡터 \(\mathbf{a}\) | 행렬 \(\mathbf{A}\) |
| 스칼라 | \(\mathbf{a}^\top \mathbf{a}\) (수) | \(\mathbf{A}^\top \mathbf{A}\) (행렬) |
| \(\hat{x}\) 또는 \(\hat{\mathbf{x}}\) | \(\mathbf{a}^\top \mathbf{b} / \mathbf{a}^\top \mathbf{a}\) | \((\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top \mathbf{b}\) |
| 투영 | \(\mathbf{p} = \mathbf{a}\hat{x}\) | \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\) |
| 투영 행렬 | \(\mathbf{a}\mathbf{a}^\top / \mathbf{a}^\top \mathbf{a}\) | \(\mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top\) |
기억법: “수로 나누는 것”이 “행렬의 역으로 교체되는 것”이다. \(1/\mathbf{a}^\top \mathbf{a} \to (\mathbf{A}^\top \mathbf{A})^{-1}\).
6.7 흔한 오해 경고
\(\mathbf{P} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top\) 에서 \((\mathbf{A}^\top \mathbf{A})^{-1} = \mathbf{A}^{-1}(\mathbf{A}^\top)^{-1}\) 로 분해하면 \(\mathbf{P} = \mathbf{A}\mathbf{A}^{-1}(\mathbf{A}^\top)^{-1}\mathbf{A}^\top = \mathbf{I}\) 가 된다 — 이것은 틀렸다.
왜? \(\mathbf{A}\) 가 \(m \times n\) 직사각 행렬이면 \(\mathbf{A}^{-1}\) 이 존재하지 않는다. 정사각 가역 행렬이 아니므로 분해 자체가 성립하지 않는다. 투영이 의미 있는 경우는 바로 \(m > n\) 인 직사각 행렬일 때이므로, 이 “상쇄 유혹”을 조심해야 한다.
단, \(\mathbf{A}\) 가 정사각 가역 행렬이면 실제로 \(\mathbf{P} = \mathbf{I}\) 이다 — \(C(\mathbf{A}) = \mathbb{R}^m\) 이므로 모든 \(\mathbf{b}\) 가 이미 열공간 안에 있기 때문이다. 이 경우 투영은 “아무것도 안 하는 것”이 맞다.
7 투영 행렬의 핵심 성질
7.1 1. 대칭성: \(\mathbf{P}^\top = \mathbf{P}\)
증명:
\[\mathbf{P}^\top = [\mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1} \mathbf{A}^\top]^\top = \mathbf{A}[(\mathbf{A}^\top \mathbf{A})^{-1}]^\top \mathbf{A}^\top\]
\(\mathbf{A}^\top \mathbf{A}\) 는 대칭이므로 그 역행렬도 대칭: \([(\mathbf{A}^\top \mathbf{A})^{-1}]^\top = [(\mathbf{A}^\top \mathbf{A})^\top]^{-1} = (\mathbf{A}^\top \mathbf{A})^{-1}\).
따라서 \(\mathbf{P}^\top = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top = \mathbf{P}\). \(\square\)
직관: 대칭성은 “투영이 수직으로 이루어진다”는 기하학적 사실의 대수적 표현이다. 비스듬한(oblique) 투영 — 수직이 아닌 방향으로 떨어뜨리는 투영 — 은 대칭이 아니다.
7.2 2. 멱등성: \(\mathbf{P}^2 = \mathbf{P}\)
증명:
\[\mathbf{P}^2 = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top \cdot \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top\]
중간의 \(\mathbf{A}^\top \mathbf{A} \cdot (\mathbf{A}^\top \mathbf{A})^{-1} = \mathbf{I}\) 로 상쇄:
\[\mathbf{P}^2 = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top = \mathbf{P}\]
직관: 이미 부분공간 위에 있는 벡터를 다시 투영하면 자기 자신이다. \(\mathbf{P}\mathbf{b}\) 는 이미 \(C(\mathbf{A})\) 에 있으므로, 다시 \(\mathbf{P}\) 를 곱해도 변하지 않는다.
7.3 3. 이 두 성질이 “투영 행렬”을 정의한다
역방향도 성립한다: \(\mathbf{P}\) 가 대칭이고 멱등이면 \(\mathbf{P}\) 는 어떤 부분공간 위로의 정사영 행렬이다.
결론: “직교 정사영 행렬” ⟺ “대칭 + 멱등”.
비대칭 멱등 행렬도 “투영”이라고 불리지만, 그것은 비스듬한(oblique) 투영이다. 이 포스트에서 “투영”이라 함은 모두 직교 정사영을 의미한다.
7.4 4. 대각합 = 랭크 = 투영하는 공간의 차원
\(\mathbf{P}\) 가 \(n\) 차원 부분공간 위로의 투영이면 \(\text{rank}(\mathbf{P}) = n\) 이고 \(\text{tr}(\mathbf{P}) = n\).
왜: 대칭 멱등 행렬의 고유값은 0 또는 1이다 (\(\lambda^2 = \lambda\) 에서). 고유값 1인 고유벡터는 투영하는 부분공간에 속하고, 고유값 0인 고유벡터는 그 직교 보공간에 속한다. 대각합 = 고유값의 합 = 1의 개수 = 투영하는 공간의 차원 = 랭크.
7.5 5. 극한 케이스로 공식 검증
투영 공식 \(\mathbf{P} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top\) 이 정말 옳은지 두 가지 극단적 경우로 확인한다.
Case 1: \(\mathbf{b}\) 가 이미 \(C(\mathbf{A})\) 안에 있을 때 — \(\mathbf{b} = \mathbf{A}\mathbf{y}\) 로 쓸 수 있다.
\[\mathbf{P}\mathbf{b} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top (\mathbf{A}\mathbf{y}) = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}(\mathbf{A}^\top \mathbf{A})\mathbf{y} = \mathbf{A}\mathbf{y} = \mathbf{b}\]
이미 열공간에 있는 벡터를 투영하면 자기 자신이 나온다. 당연한 결과 — 이미 열공간 안에 있으니 “가장 가까운 점”이 곧 자신.
Case 2: \(\mathbf{b}\) 가 \(C(\mathbf{A})\) 에 완전히 수직일 때 — §4.1에 의해 \(\mathbf{b} \in N(\mathbf{A}^\top)\), 즉 \(\mathbf{A}^\top \mathbf{b} = \mathbf{0}\).
\[\mathbf{P}\mathbf{b} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}(\mathbf{A}^\top \mathbf{b}) = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1} \cdot \mathbf{0} = \mathbf{0}\]
열공간에 수직인 벡터를 열공간에 투영하면 영벡터. 수선의 발이 원점이라는 기하학적 사실과 일치.
의미: 투영은 일종의 필터다. \(\mathbf{b}\) 에서 \(C(\mathbf{A})\) 성분은 그대로 통과시키고, \(C(\mathbf{A})^\perp\) 성분은 완전히 제거한다. \(\mathbf{b} = \mathbf{p} + \mathbf{e}\) 분해에서 \(\mathbf{p}\) 는 \(\mathbf{P}\) 가 살려주고, \(\mathbf{e} = (\mathbf{I} - \mathbf{P})\mathbf{b}\) 는 \(\mathbf{I} - \mathbf{P}\) 가 뽑아낸다.
8 \(\mathbf{A}^\top \mathbf{A}\) 의 가역성
8.1 명제
\(\mathbf{A}^\top \mathbf{A}\) 가 가역이다 \(\iff\) \(\mathbf{A}\) 의 열이 선형 독립이다.
8.2 증명
전략: \(N(\mathbf{A}^\top \mathbf{A}) = N(\mathbf{A})\) 임을 보이면 충분하다.
⊇ 방향: \(\mathbf{x} \in N(\mathbf{A})\) 이면 \(\mathbf{A}\mathbf{x} = \mathbf{0}\), 양변에 \(\mathbf{A}^\top\) 곱하면 \(\mathbf{A}^\top \mathbf{A} \mathbf{x} = \mathbf{0}\). \(\square\)
⊆ 방향: \(\mathbf{x} \in N(\mathbf{A}^\top \mathbf{A})\) 이면 \(\mathbf{A}^\top \mathbf{A} \mathbf{x} = \mathbf{0}\). 양변에 \(\mathbf{x}^\top\) 을 곱하면:
\[\mathbf{x}^\top \mathbf{A}^\top \mathbf{A} \mathbf{x} = (\mathbf{A}\mathbf{x})^\top (\mathbf{A}\mathbf{x}) = \|\mathbf{A}\mathbf{x}\|^2 = 0\]
길이 제곱이 0이면 벡터가 0이므로 \(\mathbf{A}\mathbf{x} = \mathbf{0}\), 즉 \(\mathbf{x} \in N(\mathbf{A})\). \(\square\)
결론: \(N(\mathbf{A}^\top \mathbf{A}) = N(\mathbf{A})\). \(\mathbf{A}\) 의 열이 독립이면 \(N(\mathbf{A}) = \{\mathbf{0}\}\), 따라서 \(N(\mathbf{A}^\top \mathbf{A}) = \{\mathbf{0}\}\). 정사각 행렬 \(\mathbf{A}^\top \mathbf{A}\) 의 영공간이 0이면 가역이다.
8.3 \(\mathbf{A}^\top \mathbf{A}\) 의 성질 요약
\(\mathbf{A}\) 의 열이 독립일 때:
- 정사각: \(n \times n\)
- 대칭: \((\mathbf{A}^\top \mathbf{A})^\top = \mathbf{A}^\top (\mathbf{A}^\top)^\top = \mathbf{A}^\top \mathbf{A}\)
- 가역: 위 증명
- 양정치(positive definite): 임의의 비자명 \(\mathbf{x}\) 에 대해 \(\mathbf{x}^\top \mathbf{A}^\top \mathbf{A} \mathbf{x} = \|\mathbf{A}\mathbf{x}\|^2 > 0\)
“직사각 행렬 문제는 거의 항상 \(\mathbf{A}^\top \mathbf{A}\) 로 이어진다” (Strang, 2009, Ch.4).
9 완전 계산 예시
\[\mathbf{A} = \begin{bmatrix} 1 & 0 \\ 1 & 1 \\ 1 & 2 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 6 \\ 0 \\ 0 \end{bmatrix}\]
9.1 Step 1: \(\mathbf{A}^\top \mathbf{A}\) 와 \(\mathbf{A}^\top \mathbf{b}\) 계산
\[\mathbf{A}^\top \mathbf{A} = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 2 \end{bmatrix}\begin{bmatrix} 1 & 0 \\ 1 & 1 \\ 1 & 2 \end{bmatrix} = \begin{bmatrix} 3 & 3 \\ 3 & 5 \end{bmatrix}\]
\[\mathbf{A}^\top \mathbf{b} = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 2 \end{bmatrix}\begin{bmatrix} 6 \\ 0 \\ 0 \end{bmatrix} = \begin{bmatrix} 6 \\ 0 \end{bmatrix}\]
9.2 Step 2: 정규방정식 풀기
\[\begin{bmatrix} 3 & 3 \\ 3 & 5 \end{bmatrix}\hat{\mathbf{x}} = \begin{bmatrix} 6 \\ 0 \end{bmatrix}\]
소거법: \(R_2 - R_1 \to R_2\): \(\begin{bmatrix} 3 & 3 \\ 0 & 2 \end{bmatrix}\hat{\mathbf{x}} = \begin{bmatrix} 6 \\ -6 \end{bmatrix}\)
후치환: \(2\hat{x}_2 = -6 \Rightarrow \hat{x}_2 = -3\), \(3\hat{x}_1 + 3(-3) = 6 \Rightarrow \hat{x}_1 = 5\).
\[\hat{\mathbf{x}} = \begin{bmatrix} 5 \\ -3 \end{bmatrix}\]
9.3 Step 3: 투영 벡터 \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\)
\[\mathbf{p} = 5\begin{bmatrix} 1 \\ 1 \\ 1 \end{bmatrix} - 3\begin{bmatrix} 0 \\ 1 \\ 2 \end{bmatrix} = \begin{bmatrix} 5 \\ 2 \\ -1 \end{bmatrix}\]
9.4 Step 4: 오차 \(\mathbf{e} = \mathbf{b} - \mathbf{p}\)
\[\mathbf{e} = \begin{bmatrix} 6 \\ 0 \\ 0 \end{bmatrix} - \begin{bmatrix} 5 \\ 2 \\ -1 \end{bmatrix} = \begin{bmatrix} 1 \\ -2 \\ 1 \end{bmatrix}\]
수직성 검증: \(\mathbf{e}\) 가 \(\mathbf{A}\) 의 두 열과 수직이어야 한다.
- \(\mathbf{e} \cdot (1,1,1)^\top = 1 - 2 + 1 = 0\) ✓
- \(\mathbf{e} \cdot (0,1,2)^\top = 0 - 2 + 2 = 0\) ✓
9.5 Step 5: 투영 행렬 \(\mathbf{P}\)
\[(\mathbf{A}^\top \mathbf{A})^{-1} = \frac{1}{15 - 9}\begin{bmatrix} 5 & -3 \\ -3 & 3 \end{bmatrix} = \frac{1}{6}\begin{bmatrix} 5 & -3 \\ -3 & 3 \end{bmatrix}\]
\[\mathbf{P} = \mathbf{A}(\mathbf{A}^\top \mathbf{A})^{-1}\mathbf{A}^\top = \frac{1}{6}\begin{bmatrix} 5 & 2 & -1 \\ 2 & 2 & 2 \\ -1 & 2 & 5 \end{bmatrix}\]
검증: - \(\mathbf{P}\mathbf{b} = \mathbf{p}\): \(\frac{1}{6}(5 \cdot 6, 2 \cdot 6, -1 \cdot 6)^\top = (5, 2, -1)^\top\) ✓ - \(\mathbf{P}\) 대칭 ✓ - \(\text{tr}(\mathbf{P}) = (5 + 2 + 5)/6 = 2\) = 투영 공간의 차원 (2) ✓
A = np.array([[1, 0],
[1, 1],
[1, 2]], dtype=float)
b = np.array([6, 0, 0], dtype=float)
# 정규방정식
AtA = A.T @ A
Atb = A.T @ b
print("AᵀA =")
print(AtA)
print(f"Aᵀb = {Atb}")
# 정규방정식 풀기
x_hat = np.linalg.solve(AtA, Atb)
print(f"\nx̂ = {x_hat}") # [5, -3]
# 투영 벡터
p = A @ x_hat
e = b - p
print(f"\np = Ax̂ = {p}")
print(f"e = b - p = {e}")
# 수직성 검증
print(f"\n수직성 검증:")
print(f" e · A[:,0] = {e @ A[:, 0]:.10f}")
print(f" e · A[:,1] = {e @ A[:, 1]:.10f}")
# 투영 행렬
P = A @ np.linalg.inv(AtA) @ A.T
print(f"\n투영 행렬 P =\n{P}")
print(f"\nPb = {P @ b} (= p ✓)")
# 성질 검증
print(f"\nPᵀ = P? {np.allclose(P, P.T)}")
print(f"P² = P? {np.allclose(P @ P, P)}")
print(f"랭크: {np.linalg.matrix_rank(P)}") # 2
print(f"대각합: {np.trace(P):.4f}") # 2 (= 랭크)10 시각화: 평면 위로의 투영
from mpl_toolkits.mplot3d import Axes3D
# 이전 예시 사용
A = np.array([[1, 0],
[1, 1],
[1, 2]], dtype=float)
b = np.array([6, 0, 0], dtype=float)
AtA = A.T @ A
x_hat = np.linalg.solve(AtA, A.T @ b)
p = A @ x_hat
e = b - p
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 평면 (열공간) 그리기
u = np.linspace(-2, 8, 20)
v = np.linspace(-4, 4, 20)
U, V = np.meshgrid(u, v)
X = U * A[0, 0] + V * A[0, 1]
Y = U * A[1, 0] + V * A[1, 1]
Z = U * A[2, 0] + V * A[2, 1]
ax.plot_surface(X, Y, Z, alpha=0.2, color='cyan')
# 열벡터 (기저)
ax.quiver(0, 0, 0, A[0,0], A[1,0], A[2,0],
color='blue', arrow_length_ratio=0.1, label='열 1')
ax.quiver(0, 0, 0, A[0,1], A[1,1], A[2,1],
color='purple', arrow_length_ratio=0.1, label='열 2')
# b, p, e
ax.quiver(0, 0, 0, b[0], b[1], b[2],
color='red', arrow_length_ratio=0.05, label='b')
ax.quiver(0, 0, 0, p[0], p[1], p[2],
color='green', arrow_length_ratio=0.1, label='p = 투영')
ax.quiver(p[0], p[1], p[2], e[0], e[1], e[2],
color='orange', arrow_length_ratio=0.2, label='e = 오차')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('부분공간 위로의 투영: b = p + e')
ax.legend()
plt.tight_layout()
plt.savefig('projection_3d.png', dpi=100, bbox_inches='tight')
plt.show()11 응용
| 분야 | 투영의 역할 |
|---|---|
| 통계 (회귀) | 잔차 최소화 = 관측값을 모델 부분공간에 투영 |
| 머신러닝 (PCA) | 데이터를 주성분 부분공간에 투영 |
| 신호처리 | 노이즈 제거 = 신호 부분공간에 투영 |
| 제어공학 | 상태 공간 추정 (칼만 필터의 기본 원리) |
| 컴퓨터 그래픽스 | 3D → 2D 화면 투영 |
| 수치해석 | 반복법(GMRES 등)에서 크릴로프 부분공간으로의 투영 |
공통 패턴: “관심 있는 부분공간이 무엇인가?”를 정한 뒤, 그 위로 투영하여 “가장 가까운 해석 가능한 값”을 얻는다.
12 핵심 요약
1D 경우 (직선 위로)
â = aᵀb / aᵀa (스칼라)
p = (aᵀb / aᵀa) a
P = aaᵀ / aᵀa (rank 1)
n-D 경우 (부분공간 위로)
AᵀA x̂ = Aᵀb (정규방정식)
x̂ = (AᵀA)⁻¹ Aᵀb
p = A(AᵀA)⁻¹ Aᵀ b
P = A(AᵀA)⁻¹ Aᵀ (rank n, A 열 독립 시)
모든 투영 행렬의 공통 성질
Pᵀ = P (대칭)
P² = P (멱등)
tr(P) = rank(P) = 투영 차원
I - P 는 직교 보공간 위로의 투영
결정적 조건: A의 열 선형 독립 ⟺ AᵀA 가역
13 관련 주제
선행 지식
- Ch.4 §4.1 — Orthogonality of the Four Subspaces — 오차가 좌영공간에 속하는 이유
- Ch.4 Overview — 직교성 개요
동일 챕터 후속
- Ch.4 §4.3 — Least Squares Approximations — 최소제곱 해의 세 가지 유도
- Ch.4 §4.4 — Orthogonal Bases and Gram-Schmidt — 투영 공식이 단순해지는 정규직교 기저
응용 연결
- 최소제곱 회귀 — 통계에서의 투영 응용
- PCA (예정) — 데이터의 주축 부분공간 투영
- Kalman Filter (예정) — 동적 시스템의 반복 투영