Ch.4 §4.3 — Least Squares Approximations (최소제곱 근사)

해가 없는 \(Ax=b\) 의 최선의 해 — 기하·대수·미적분 세 관점으로 유도하는 정규방정식

과결정(overdetermined) 연립방정식 \(Ax=b\) 가 해를 갖지 않을 때, 오차의 제곱합 \(\|Ax-b\|^2\) 를 최소화하는 \(\hat{x}\) 를 구한다. 정규방정식 \(A^\top A \hat{x} = A^\top b\) 를 기하학(수직 조건), 대수 (\(b = p + e\) 분해), 미적분(편미분 = 0) 세 가지 방식으로 유도하고, 직선·포물선 적합 예시와 이상치 민감성을 상세히 다룬다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 10일

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 관련 주제

선행 지식

동일 챕터 후속

응용 연결

  • 최소제곱 회귀 — 통계적 해석 (OLS, 잔차 분석)
  • Ridge/Lasso (예정) — 정규화가 추가된 최소제곱
  • Kalman Filter (예정) — 순차적 최소제곱 업데이트

Subscribe

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