1 이 절의 위치
§4.2에서 투영의 수학을 완성했다. §4.3은 그 수학을 데이터 분석의 언어로 번역한다.
§4.1 네 부분공간의 직교성
↓
§4.2 투영: p = A(AᵀA)⁻¹Aᵀb
↓ "그런데 이게 왜 최선인가?"
§4.3 최소제곱법 ← 지금 여기
↓ "기저를 직교화하면 계산이 쉬워진다"
§4.4 Gram-Schmidt & QR 분해
§4.2에서 투영 \(\mathbf{p}\) 를 강조했다면, §4.3은 해 \(\hat{\mathbf{x}}\) 를 강조한다. 두 값은 \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\) 로 연결된다. 그러나 “왜 이것이 최선인가?”에 답하려면 전혀 다른 세 가지 증명 — 기하·대수·미적분 — 을 거쳐야 한다. 세 증명이 모두 같은 정규방정식 \(\mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}\) 로 수렴하는 것이 이 절의 아름다움이다.
2 왜 최소제곱인가
2.1 과결정 연립방정식
실제 문제에서는 \(\mathbf{A}\) 가 \(m \times n\) 직사각 행렬이고 \(m \gg n\) 인 경우가 많다.
- 측정값 1,000개로 파라미터 10개 추정: \(m = 1000, n = 10\)
- 주식 데이터 1,000일로 요인 5개 추정: \(m = 1000, n = 5\)
이런 과결정(overdetermined) 시스템에서는 \(\mathbf{b}\) 가 \(\mathbf{A}\) 의 좁은 열공간 \(C(\mathbf{A})\) 에 정확히 들어맞는 일이 거의 없다. 측정에 노이즈가 섞여있거나, 모델이 단순해서 데이터를 완벽히 통과하지 못한다.
\(\mathbf{b} \notin C(\mathbf{A}) \Rightarrow \mathbf{A}\mathbf{x} = \mathbf{b}\) 는 해가 없다.
2.2 질문의 재구성
해를 포기하는 대신, 질문을 바꾼다.
“오차 \(\mathbf{e} = \mathbf{b} - \mathbf{A}\mathbf{x}\) 를 가장 작게 만드는 \(\mathbf{x}\) 는 무엇인가?”
“가장 작다”는 것을 길이(노름)로 재면:
\[\hat{\mathbf{x}} = \arg\min_{\mathbf{x}} \|\mathbf{A}\mathbf{x} - \mathbf{b}\|^2\]
이것이 최소제곱 해(least squares solution)이다. 제곱을 쓰는 이유: (1) 양수만 남겨 합산, (2) 미분 가능해 최적화 쉬움, (3) 통계적으로 가우시안 노이즈 가정 하에서 MLE와 일치.
2.3 직관: 가장 가까운 열공간의 점
기하학적으로 이 문제는 §4.2의 투영과 같다.
\(\mathbf{A}\mathbf{x}\) 는 \(C(\mathbf{A})\) 의 모든 점을 훑는다 (\(\mathbf{x}\) 가 모든 가능한 조합이므로). \(\|\mathbf{A}\mathbf{x} - \mathbf{b}\|\) 는 그 점에서 \(\mathbf{b}\) 까지의 거리다. \(C(\mathbf{A})\) 에서 \(\mathbf{b}\) 에 가장 가까운 점은 \(\mathbf{b}\) 의 \(C(\mathbf{A})\) 위로의 투영 \(\mathbf{p}\) 이다.
따라서 \(\mathbf{A}\hat{\mathbf{x}} = \mathbf{p}\) 이고, 남은 오차 \(\mathbf{e} = \mathbf{b} - \mathbf{p}\) 는 피할 수 없는 “최소 오차”이다.
3 핵심 예시: 3점에 직선 적합
구체적 예시로 먼저 감을 잡는다. (Strang Ch.4 §4.3 Example 1)
3.1 문제
세 점 \((t, b) = (0, 6), (1, 0), (2, 0)\) 을 지나는 직선 \(b = C + Dt\) 를 찾는다.
세 점을 직선 방정식에 대입하면 세 개의 방정식을 얻는다.
\[\begin{cases} C + 0 \cdot D = 6 \\ C + 1 \cdot D = 0 \\ C + 2 \cdot D = 0 \end{cases}\]
행렬 형태로:
\[\underbrace{\begin{bmatrix} 1 & 0 \\ 1 & 1 \\ 1 & 2 \end{bmatrix}}_{\mathbf{A}} \underbrace{\begin{bmatrix} C \\ D \end{bmatrix}}_{\mathbf{x}} = \underbrace{\begin{bmatrix} 6 \\ 0 \\ 0 \end{bmatrix}}_{\mathbf{b}}\]
3.2 해가 없음을 확인
\(\mathbf{b} = (6, 0, 0)^\top\) 이 \(\mathbf{A}\) 의 두 열 \((1,1,1)^\top\) 과 \((0,1,2)^\top\) 의 선형결합으로 표현되는가? \((1,1,1)^\top\) 은 등간격 성분, \((0,1,2)^\top\) 도 등간격 성분. 이 둘의 조합은 \(t\) 에 대해 선형이므로 \((6, 0, 0)\) 처럼 “가운데가 떨어지는” 형태는 만들 수 없다. 해 없음.
기하학적 해석: 이 세 점은 한 직선 위에 놓여있지 않다. 어떤 직선도 세 점을 모두 정확히 통과할 수 없다.
따라서 “최선의 직선” — 모든 점에서의 세로 거리의 제곱합을 최소로 만드는 직선 — 을 찾아야 한다.
4 최소제곱의 세 가지 유도
같은 결과를 세 가지 다른 방법으로 유도한다. 이 통일성이 선형대수의 힘이다.
4.1 유도 1: 기하학 — 90도 조건
오차 벡터 \(\mathbf{e} = \mathbf{b} - \mathbf{A}\hat{\mathbf{x}}\) 가 \(C(\mathbf{A})\) 에 수직이어야 한다. “수직”이 “가장 짧은 거리”를 만든다 (평면 밖의 점에서 평면까지의 최단 거리는 수선의 발까지의 거리).
\(\mathbf{e}\) 가 \(\mathbf{A}\) 의 모든 열과 수직 ⟺ \(\mathbf{A}^\top \mathbf{e} = \mathbf{0}\)
\[\mathbf{A}^\top (\mathbf{b} - \mathbf{A}\hat{\mathbf{x}}) = \mathbf{0}\]
\[\boxed{\mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}}\]
직관: “오차가 더 이상 줄어들 수 없는 지점”은 “오차가 수직인 지점”이다. 수직이 아니라면 \(\mathbf{A}\mathbf{x}\) 를 그 방향으로 조금 움직여서 오차를 줄일 수 있다.
4.2 유도 2: 대수 — \(\mathbf{b} = \mathbf{p} + \mathbf{e}\) 분해
§4.1의 결과 \(\mathbb{R}^m = C(\mathbf{A}) \oplus N(\mathbf{A}^\top)\) 에 의해 \(\mathbf{b}\) 를 두 성분으로 유일하게 분해한다.
\[\mathbf{b} = \mathbf{p} + \mathbf{e}, \quad \mathbf{p} \in C(\mathbf{A}), \quad \mathbf{e} \in N(\mathbf{A}^\top)\]
이제 \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 를 풀 수 없어도, 대신 \(\mathbf{A}\hat{\mathbf{x}} = \mathbf{p}\) 는 풀 수 있다 (\(\mathbf{p}\) 는 열공간 안에 있으므로). 오차 부분은 피할 수 없다 — 그것이 바로 \(\mathbf{e}\) 다.
임의의 \(\mathbf{x}\) 에 대해 길이 제곱을 보면:
\[\|\mathbf{A}\mathbf{x} - \mathbf{b}\|^2 = \|\mathbf{A}\mathbf{x} - \mathbf{p} - \mathbf{e}\|^2 = \|\underbrace{\mathbf{A}\mathbf{x} - \mathbf{p}}_{\in \, C(\mathbf{A})}\|^2 + \|\underbrace{\mathbf{e}}_{\in \, N(\mathbf{A}^\top)}\|^2\]
마지막 등식은 피타고라스 정리 — \(\mathbf{A}\mathbf{x} - \mathbf{p}\) 는 열공간에, \(\mathbf{e}\) 는 좌영공간에 있어 서로 수직이다.
핵심: 오른쪽의 두 항 중 두 번째 \(\|\mathbf{e}\|^2\) 은 상수 (피할 수 없는 오차). 첫 번째 \(\|\mathbf{A}\mathbf{x} - \mathbf{p}\|^2\) 는 \(\mathbf{x}\) 의 선택에 따라 달라진다. 이것을 0으로 만드는 유일한 \(\mathbf{x}\) 가 \(\hat{\mathbf{x}}\) 이고, 그때 \(\mathbf{A}\hat{\mathbf{x}} = \mathbf{p}\).
결과: \(\mathbf{e} = \mathbf{b} - \mathbf{A}\hat{\mathbf{x}} \in N(\mathbf{A}^\top) \Rightarrow \mathbf{A}^\top \mathbf{e} = 0 \Rightarrow \mathbf{A}^\top \mathbf{A}\hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}\). \(\square\)
직관: 최소제곱은 \(\mathbf{b}\) 를 “할 수 있는 부분”과 “할 수 없는 부분”으로 쪼갠 뒤, 할 수 있는 부분만 맞춘다. 이것이 가능한 이유는 두 부분이 직교하기 때문이다.
4.3 유도 3: 미적분 — 편미분 = 0
오차 함수를 명시적으로 쓴다. 예시 3점 데이터의 경우:
\[E(C, D) = \|\mathbf{A}\mathbf{x} - \mathbf{b}\|^2 = (C + 0 \cdot D - 6)^2 + (C + 1 \cdot D)^2 + (C + 2 \cdot D)^2\]
최소점에서 두 편미분이 모두 0:
\[\frac{\partial E}{\partial C} = 2(C - 6) + 2(C + D) + 2(C + 2D) = 0\]
\[\frac{\partial E}{\partial D} = 2(C - 6) \cdot 0 + 2(C + D) \cdot 1 + 2(C + 2D) \cdot 2 = 0\]
2로 나누고 정리:
\[\frac{\partial E}{\partial C} = 0: \quad 3C + 3D = 6\] \[\frac{\partial E}{\partial D} = 0: \quad 3C + 5D = 0\]
행렬로 쓰면:
\[\begin{bmatrix} 3 & 3 \\ 3 & 5 \end{bmatrix}\begin{bmatrix} C \\ D \end{bmatrix} = \begin{bmatrix} 6 \\ 0 \end{bmatrix}\]
이 계수 행렬이 정확히 \(\mathbf{A}^\top \mathbf{A}\) 이고 우변이 \(\mathbf{A}^\top \mathbf{b}\) 다. 즉 미적분의 일계 조건(FOC)이 선형대수의 정규방정식과 완전히 일치한다.
직관: \(E\) 는 \(\mathbf{x}\) 에 대한 이차함수(quadratic form)이므로 볼록한 포물면을 이룬다. 포물면의 바닥점이 유일한 최솟값이고, 그 지점에서 기울기가 0이다. “그릇의 가장 낮은 점에서는 어느 방향으로 움직여도 바로 위로 올라간다” — 이것이 편미분 = 0의 기하학적 의미.
4.4 세 유도의 의미
| 유도 | 핵심 아이디어 | 장점 |
|---|---|---|
| 기하 | 오차 \(\perp\) 열공간 | 시각적 직관, 증명 간단 |
| 대수 | \(\mathbf{b} = \mathbf{p} + \mathbf{e}\) 분해 | 오차의 본질(좌영공간)을 드러냄 |
| 미적분 | \(\nabla E = 0\) | 비선형 모델로 일반화 가능 |
세 방법이 같은 결과를 준다는 것이 “선형대수는 통일된 언어”임을 보여준다.
5 예시 완전 풀이
\[\mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}\]
위 3점 예시를 직접 푼다.
5.1 Step 1: \(\mathbf{A}^\top \mathbf{A}\) 계산
\[\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}\]
5.2 Step 2: \(\mathbf{A}^\top \mathbf{b}\) 계산
\[\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}\]
5.3 Step 3: 정규방정식 풀기
\[\begin{bmatrix} 3 & 3 \\ 3 & 5 \end{bmatrix}\begin{bmatrix} C \\ D \end{bmatrix} = \begin{bmatrix} 6 \\ 0 \end{bmatrix}\]
소거: \(R_2 - R_1\): \(\begin{bmatrix} 3 & 3 \\ 0 & 2 \end{bmatrix}\begin{bmatrix} C \\ D \end{bmatrix} = \begin{bmatrix} 6 \\ -6 \end{bmatrix}\)
후치환: \(2D = -6 \Rightarrow D = -3\), \(3C - 9 = 6 \Rightarrow C = 5\).
결과: \(\hat{\mathbf{x}} = (5, -3)^\top\), 즉 최적 직선은 \(b = 5 - 3t\).
5.4 Step 4: 투영과 오차 확인
- \(t = 0\): \(p_1 = 5\), \(b_1 = 6\), \(e_1 = 1\)
- \(t = 1\): \(p_2 = 2\), \(b_2 = 0\), \(e_2 = -2\)
- \(t = 2\): \(p_3 = -1\), \(b_3 = 0\), \(e_3 = 1\)
검증 1 — 오차의 합이 0: \(e_1 + e_2 + e_3 = 1 - 2 + 1 = 0\) ✓
왜 오차의 합이 0인가: \(\mathbf{A}\) 의 첫 열이 \((1, 1, 1)^\top\) 이므로 \(\mathbf{A}^\top \mathbf{e} = \mathbf{0}\) 의 첫 방정식이 \(\sum e_i = 0\) 이 된다. 모델에 상수항이 포함되면 잔차의 합은 항상 0이다. (통계 회귀에서 “잔차의 평균은 0”이라는 성질.)
검증 2 — 오차 ⊥ 두 번째 열: \((0, 1, 2) \cdot (1, -2, 1) = 0 - 2 + 2 = 0\) ✓
검증 3 — 제곱 오차: \(\|\mathbf{e}\|^2 = 1 + 4 + 1 = 6\). 이것이 어떤 직선을 선택해도 줄일 수 없는 최소 오차다.
import numpy as np
import matplotlib.pyplot as plt
t = np.array([0.0, 1.0, 2.0])
b = np.array([6.0, 0.0, 0.0])
A = np.column_stack([np.ones_like(t), t])
print("A =")
print(A)
print(f"b = {b}")
# 정규방정식
AtA = A.T @ A
Atb = A.T @ b
print(f"\nAᵀA =\n{AtA}")
print(f"Aᵀb = {Atb}")
# 풀이
x_hat = np.linalg.solve(AtA, Atb)
print(f"\n최적 해: ĉ = {x_hat[0]}, D̂ = {x_hat[1]}")
print(f"최적 직선: b = {x_hat[0]} + ({x_hat[1]})t")
# 투영과 오차
p = A @ x_hat
e = b - p
print(f"\np = {p}")
print(f"e = b - p = {e}")
print(f"오차의 합: {e.sum():.10f}")
print(f"‖e‖² = {e @ e}")
# 검증: numpy.linalg.lstsq와 비교
x_lstsq, residuals, rank, sv = np.linalg.lstsq(A, b, rcond=None)
print(f"\nnumpy lstsq: {x_lstsq} (일치 확인)")5.5 시각화
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 왼쪽: 데이터 점과 최적 직선
ax = axes[0]
ax.scatter(t, b, s=100, color='red', zorder=3, label='데이터 $(t_i, b_i)$')
t_line = np.linspace(-0.5, 2.5, 100)
b_line = x_hat[0] + x_hat[1] * t_line
ax.plot(t_line, b_line, 'steelblue', linewidth=2,
label=f'최적 직선 $b = {x_hat[0]:.0f} + ({x_hat[1]:.0f})t$')
ax.scatter(t, p, s=80, color='green', marker='x', zorder=3,
label='투영 $p_i$ (직선 위 점)')
# 오차 막대 (수직선)
for ti, bi, pi, ei in zip(t, b, p, e):
ax.plot([ti, ti], [bi, pi], 'orange', linewidth=2, linestyle='--')
ax.annotate(f'$e={ei:.0f}$', xy=(ti+0.05, (bi+pi)/2), fontsize=9)
ax.axhline(0, color='gray', linewidth=0.3)
ax.set_xlabel('$t$'); ax.set_ylabel('$b$')
ax.set_title('최소제곱 직선 적합')
ax.legend(loc='upper right', fontsize=9)
ax.grid(True, alpha=0.3)
# 오른쪽: 오차 함수 E(C, D) 등고선
ax2 = axes[1]
C_vals = np.linspace(3, 7, 60)
D_vals = np.linspace(-5, -1, 60)
C_grid, D_grid = np.meshgrid(C_vals, D_vals)
E_grid = np.zeros_like(C_grid)
for i in range(len(t)):
E_grid += (C_grid + D_grid * t[i] - b[i])**2
cs = ax2.contour(C_grid, D_grid, E_grid, levels=20, cmap='viridis')
ax2.clabel(cs, inline=True, fontsize=8)
ax2.scatter([x_hat[0]], [x_hat[1]], s=150, color='red', marker='*',
zorder=5, label=f'최솟값 $\\hat{{x}} = ({x_hat[0]:.0f}, {x_hat[1]:.0f})$')
ax2.set_xlabel('$C$'); ax2.set_ylabel('$D$')
ax2.set_title(r'오차 함수 $E(C,D) = \|\mathbf{A}\mathbf{x}-\mathbf{b}\|^2$ 등고선')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('least_squares_line.png', dpi=100, bbox_inches='tight')
plt.show()6 일반 공식: \(m\) 점 직선 적합
\(m\) 개의 점 \((t_i, b_i)\) 가 주어졌을 때, 직선 \(b = C + Dt\) 를 최소제곱으로 적합한다.
6.1 설계행렬과 정규방정식
\[\mathbf{A} = \begin{bmatrix} 1 & t_1 \\ 1 & t_2 \\ \vdots & \vdots \\ 1 & t_m \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_m \end{bmatrix}\]
\[\mathbf{A}^\top \mathbf{A} = \begin{bmatrix} m & \sum t_i \\ \sum t_i & \sum t_i^2 \end{bmatrix}, \quad \mathbf{A}^\top \mathbf{b} = \begin{bmatrix} \sum b_i \\ \sum t_i b_i \end{bmatrix}\]
정규방정식:
\[\begin{bmatrix} m & \sum t_i \\ \sum t_i & \sum t_i^2 \end{bmatrix}\begin{bmatrix} C \\ D \end{bmatrix} = \begin{bmatrix} \sum b_i \\ \sum t_i b_i \end{bmatrix}\]
6.2 통계적 해석
이 행렬 원소들을 통계 언어로 번역하면:
- \(m\) = 샘플 크기
- \(\sum t_i / m = \bar{t}\) (평균)
- \(\sum t_i^2 / m - \bar{t}^2 = \text{Var}(t)\) (분산)
- \(\sum t_i b_i / m - \bar{t}\bar{b} = \text{Cov}(t, b)\) (공분산)
정규방정식을 풀면 잘 알려진 회귀 공식이 나온다.
\[\hat{D} = \frac{\text{Cov}(t, b)}{\text{Var}(t)}, \quad \hat{C} = \bar{b} - \hat{D}\bar{t}\]
직관: 기울기 \(D\) 는 “\(t\) 와 \(b\) 가 같이 움직이는 정도” ÷ “\(t\) 가 움직이는 정도”다. 절편 \(C\) 는 직선이 평균점 \((\bar{t}, \bar{b})\) 를 반드시 지나도록 조정한다. 최소제곱 회귀는 통계의 단순 선형회귀와 정확히 같은 공식이다.
6.3 시간 중심화로 \(\mathbf{A}^\top \mathbf{A}\) 대각화
시간을 중심화 (\(T_i = t_i - \bar{t}\))하면 \(\sum T_i = 0\) 이 되어 \(\mathbf{A}^\top \mathbf{A}\) 가 대각행렬이 된다.
\[\mathbf{A}^\top \mathbf{A} = \begin{bmatrix} m & 0 \\ 0 & \sum T_i^2 \end{bmatrix}\]
그러면 \(C\) 와 \(D\) 가 분리되어 각자 독립적으로 풀린다.
\[\hat{C} = \frac{\sum b_i}{m} = \bar{b}, \quad \hat{D} = \frac{\sum T_i b_i}{\sum T_i^2}\]
이것이 Gram-Schmidt 과정의 맛보기 — “기저를 직교화하면 정규방정식이 대각화되어 계산이 쉬워진다”.
7 포물선 적합 — 비선형 함수의 선형 적합
“선형” 최소제곱은 파라미터에 대해 선형이라는 뜻이다. 함수 자체는 비선형(예: \(t^2\))이어도 된다.
7.1 문제
데이터 \((t_i, b_i)\) 를 포물선 \(b = C + Dt + Et^2\) 로 적합한다.
\(n = 3\) 개의 파라미터 \(C, D, E\). 설계행렬:
\[\mathbf{A} = \begin{bmatrix} 1 & t_1 & t_1^2 \\ 1 & t_2 & t_2^2 \\ \vdots & \vdots & \vdots \\ 1 & t_m & t_m^2 \end{bmatrix}\]
\(m > 3\) 이면 과결정이고, 정규방정식 \(\mathbf{A}^\top \mathbf{A} \hat{\mathbf{x}} = \mathbf{A}^\top \mathbf{b}\) 로 \(\hat{\mathbf{x}} = (C, D, E)^\top\) 을 구한다.
핵심: 열 자체(\(t^2\))는 비선형이지만, 미지수 \(C, D, E\) 에 대해서는 선형이다. 따라서 정규방정식 기법이 그대로 적용된다. 동일한 논리로 다항식·지수함수·삼각함수 기반의 선형결합 모델 — 즉 일반적인 basis expansion — 을 모두 적합할 수 있다.
# 포물선 적합 예시: 공의 낙하 궤적
np.random.seed(42)
t_data = np.linspace(0, 2, 20)
# 진짜 파라미터: C=1, D=5, E=-4.9 (공 던지기)
true_params = np.array([1.0, 5.0, -4.9])
noise = np.random.normal(0, 0.3, 20)
b_data = true_params[0] + true_params[1] * t_data + true_params[2] * t_data**2 + noise
# 설계행렬
A = np.column_stack([np.ones_like(t_data), t_data, t_data**2])
# 정규방정식
AtA = A.T @ A
Atb = A.T @ b_data
x_hat = np.linalg.solve(AtA, Atb)
print(f"진짜 파라미터: C={true_params[0]:.2f}, D={true_params[1]:.2f}, E={true_params[2]:.2f}")
print(f"추정 파라미터: Ĉ={x_hat[0]:.2f}, D̂={x_hat[1]:.2f}, Ê={x_hat[2]:.2f}")
# 시각화
fig, ax = plt.subplots(figsize=(8, 5))
ax.scatter(t_data, b_data, s=50, color='red', label='노이즈 포함 데이터', zorder=3)
t_fit = np.linspace(0, 2, 100)
b_fit = x_hat[0] + x_hat[1]*t_fit + x_hat[2]*t_fit**2
b_true = true_params[0] + true_params[1]*t_fit + true_params[2]*t_fit**2
ax.plot(t_fit, b_true, 'g--', linewidth=2, label='진짜 포물선', alpha=0.7)
ax.plot(t_fit, b_fit, 'steelblue', linewidth=2, label='최소제곱 적합')
ax.set_xlabel('시간 $t$'); ax.set_ylabel('높이 $b$')
ax.set_title('포물선 최소제곱 적합 — $b = C + Dt + Et^2$')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()8 왜 “제곱”인가 — 다른 노름과의 비교
오차의 크기를 “제곱합”으로 재는 것은 유일한 선택이 아니다. 다른 선택지:
| 노름 | 정의 | 최솟값을 주는 추정량 |
|---|---|---|
| \(L_2\) (제곱합) | \(\sum e_i^2\) | 산술평균 (상수 적합 시) |
| \(L_1\) (절대값) | \(\sum \|e_i\|\) | 중앙값 |
| \(L_\infty\) (최댓값) | \(\max \|e_i\|\) | 중간점 (min/max 평균) |
8.1 예시: 이상치가 있는 경우
값 \((0, 0, 0, 0, 0, 0, 0, 0, 0, 40)\) 에 상수 \(C\) 를 적합한다. 세 방법의 결과:
- \(L_2\) 최소제곱: \(\hat{C} = 40/10 = 4\) (산술평균)
- \(L_\infty\) 최소 최댓값: \(\hat{C} = 20\) (0과 40의 중간점 — 양쪽 오차를 대칭화)
- \(L_1\) 최소 절대값: \(\hat{C} = 0\) (중앙값)
직관: 제곱은 큰 오차를 더 크게 처벌한다. 따라서 이상치 하나가 추정값을 크게 끌어당긴다. 절대값은 모든 오차를 평등하게 대하므로 이상치에 강건(robust)하다. 최댓값은 최악의 오차만 본다 (미니맥스).
| 목적 | 추천 |
|---|---|
| 선형 대수가 풀어주는 빠른 계산 | \(L_2\) 최소제곱 |
| 이상치에 강건한 추정 | \(L_1\) (중앙값 회귀) |
| 최악의 오차 제어 | \(L_\infty\) (체비셰프 근사) |
왜 여전히 \(L_2\) 가 기본값인가: (1) 미분 가능 → 닫힌 형태의 해, (2) 가우시안 노이즈 가정 하에서 MLE, (3) 직교성의 언어로 번역됨, (4) 계산 속도. \(L_1, L_\infty\) 는 방정식이 비선형이 되어 선형 프로그래밍이나 반복법이 필요하다.
# 세 노름의 차이 시연
data = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 40], dtype=float)
# L2: 평균
C_L2 = data.mean()
# L1: 중앙값
C_L1 = np.median(data)
# L∞: (min + max) / 2
C_Linf = (data.min() + data.max()) / 2
print(f"데이터: {data}")
print(f"L2 최소제곱 (평균): Ĉ = {C_L2}")
print(f"L1 최소절대값 (중앙값): Ĉ = {C_L1}")
print(f"L∞ 최소최댓값 (중간점): Ĉ = {C_Linf}")9 통계 연결: 가우시안 MLE와의 동치성
최소제곱이 “자연스러운” 선택인 또 하나의 이유는 통계에 있다.
9.1 모델
\(\mathbf{b} = \mathbf{A}\mathbf{x} + \boldsymbol{\epsilon}\) 에서 노이즈 \(\boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \sigma^2 \mathbf{I})\) (독립 등분산 가우시안).
9.2 우도함수
\[L(\mathbf{x} \mid \mathbf{b}) = \prod_{i=1}^m \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(b_i - \mathbf{a}_i^\top \mathbf{x})^2}{2\sigma^2}\right)\]
로그 우도:
\[\log L = -\frac{m}{2}\log(2\pi\sigma^2) - \frac{1}{2\sigma^2}\sum_{i=1}^m (b_i - \mathbf{a}_i^\top \mathbf{x})^2\]
9.3 MLE
\(\log L\) 을 최대화 ⟺ \(\sum (b_i - \mathbf{a}_i^\top \mathbf{x})^2 = \|\mathbf{b} - \mathbf{A}\mathbf{x}\|^2\) 를 최소화.
즉 최소제곱 해 = 가우시안 노이즈 하의 MLE.
직관: 가우시안은 “뾰족한 중심과 얇은 꼬리”를 가지므로 큰 오차를 매우 비현실적으로 본다. 이것이 큰 오차를 제곱으로 처벌하는 것과 자연스럽게 연결된다. 노이즈 분포가 두꺼운 꼬리(예: 코시, 라플라스)면 다른 손실 함수가 MLE가 된다.
10 응용
| 분야 | 최소제곱의 역할 |
|---|---|
| 통계 | 선형회귀 (OLS), 다중회귀 |
| 머신러닝 | Ridge/Lasso 회귀 (최소제곱 + 정규화) |
| 물리학 | 실험 데이터 적합 (갈릴레이의 낙하 실험) |
| 측량 | GPS 삼각측량 (다수의 위성 거리 측정) |
| 신호처리 | 시스템 식별, 칼만 필터 |
| 컴퓨터 비전 | 카메라 보정, 3D 복원 |
| 경제학 | 모델 파라미터 추정, 계량경제학 |
핵심 패턴: “데이터 → 선형 모델 → 정규방정식 → 해” 파이프라인은 거의 모든 응용과학의 기본 도구다.
11 실무 주의사항
11.1 1. \(\mathbf{A}^\top \mathbf{A}\) 를 직접 계산하지 말 것
\(\mathbf{A}^\top \mathbf{A}\) 를 형성하면 조건수가 제곱된다 (\(\kappa(\mathbf{A}^\top \mathbf{A}) = \kappa(\mathbf{A})^2\)). 수치적으로 불안정하다.
대안: QR 분해 (다음 절 §4.4) 또는 SVD 사용. NumPy의 np.linalg.lstsq 는 내부적으로 SVD를 쓴다.
11.2 2. 열이 거의 선형 종속일 때
\(\mathbf{A}\) 의 열이 거의 선형 종속이면 \(\mathbf{A}^\top \mathbf{A}\) 가 거의 특이해져 해가 불안정해진다. 이것이 다중공선성(multicollinearity) 문제다.
대안: Ridge 회귀 (\(\mathbf{A}^\top \mathbf{A} + \lambda \mathbf{I}\) 로 대각선 보강), PCA 선처리.
11.3 3. 이상치 처리
위에서 본 대로 \(L_2\) 는 이상치에 민감하다. 실무에서는 Huber 손실(작은 오차는 제곱, 큰 오차는 절대값) 같은 강건한 손실을 쓰거나, 이상치 제거 전처리가 필요할 수 있다.
12 핵심 요약
과결정 문제: Ax = b, m > n, 해 없음
↓
목표: x̂ = argmin ‖Ax - b‖²
↓
세 유도로 같은 정규방정식 도달
(1) 기하: e ⊥ C(A) → Aᵀe = 0
(2) 대수: b = p + e (피타고라스)
(3) 미적분: ∂E/∂x = 0
↓
정규방정식: AᵀAx̂ = Aᵀb
↓
해: x̂ = (AᵀA)⁻¹ Aᵀb (A 열 독립 시)
p = Ax̂ (투영)
e = b - p (최소 오차)
모델에 상수항 포함 시: ∑eᵢ = 0 (잔차의 합이 0)
직교 열 (Gram-Schmidt): AᵀA 대각화, 계수 독립 계산
13 관련 주제
선행 지식
- Ch.4 §4.1 — Orthogonality of the Four Subspaces — 잔차가 좌영공간에 속하는 이유
- Ch.4 §4.2 — Projections — \(\mathbf{p} = \mathbf{A}\hat{\mathbf{x}}\) 연결
동일 챕터 후속
- Ch.4 §4.4 — Orthogonal Bases and Gram-Schmidt — QR 분해로 최소제곱을 수치 안정적으로 풀기
응용 연결
- 최소제곱 회귀 — 통계적 해석 (OLS, 잔차 분석)
- Ridge/Lasso (예정) — 정규화가 추가된 최소제곱
- Kalman Filter (예정) — 순차적 최소제곱 업데이트