--- id: wiki-2026-0508-least-squares-methods title: Least Squares Methods category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Least-Squares, OLS, 최소제곱법] duplicate_of: none source_trust_level: A confidence_score: 0.95 verification_status: applied tags: [optimization, regression, linear-algebra, statistics] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: python framework: numpy-scipy --- # Least Squares Methods ## 매 한 줄 > **"매 residual의 제곱합을 최소화하라"**. Gauss(1795)와 Legendre(1805)가 독립 발견; 매 modern ML의 MSE loss·linear regression·Kalman filter의 직접 조상이다. 2026에도 매 LoRA fine-tuning의 closed-form initializer로 살아있다. ## 매 핵심 ### 매 정식화 - **OLS**: minimize ‖y − Xβ‖²; closed-form β̂ = (XᵀX)⁻¹Xᵀy. - **Weighted LS**: residual에 weight W; β̂ = (XᵀWX)⁻¹XᵀWy. - **Total LS**: 매 X에도 noise — SVD 기반. - **Regularized**: Ridge (L2), Lasso (L1), Elastic Net. ### 매 수치적 안정성 - Normal equation 직접 풀이는 매 condition number² 증폭 → QR/SVD 권장. - 매 LAPACK `gels` 는 QR 사용. ### 매 응용 1. Linear regression (econometrics, ML baseline). 2. Curve fitting (lmfit, scipy.optimize.curve_fit). 3. Bundle adjustment (SLAM, photogrammetry). 4. Kalman update step (least-squares projection). ## 💻 패턴 ### OLS via NumPy (lstsq) ```python import numpy as np beta, residuals, rank, sv = np.linalg.lstsq(X, y, rcond=None) ``` ### Ridge regression ```python def ridge(X, y, lam): n_features = X.shape[1] return np.linalg.solve(X.T @ X + lam * np.eye(n_features), X.T @ y) ``` ### Nonlinear least squares ```python from scipy.optimize import least_squares def residual(params, x, y): a, b, c = params return y - (a * np.exp(-b * x) + c) result = least_squares(residual, [1, 1, 0], args=(x, y)) ``` ### QR-based solve (numerically stable) ```python Q, R = np.linalg.qr(X) beta = np.linalg.solve(R, Q.T @ y) ``` ### Weighted LS ```python W_sqrt = np.sqrt(weights) beta = np.linalg.lstsq(X * W_sqrt[:, None], y * W_sqrt, rcond=None)[0] ``` ### Recursive LS (online update) ```python def rls_update(P, beta, x, y, lam=0.99): k = P @ x / (lam + x @ P @ x) beta = beta + k * (y - x @ beta) P = (P - np.outer(k, x @ P)) / lam return P, beta ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Well-conditioned, small p | Normal equation | | Ill-conditioned | QR or SVD | | Many features, sparse | Lasso | | Heteroscedastic noise | Weighted LS | | Streaming data | RLS | **기본값**: `np.linalg.lstsq` (uses SVD-based GELSD). ## 🔗 Graph - 부모: [[Linear-Algebra-Foundations]] · [[Optimization]] - 변형: [[Ridge-Regression]] · [[Lasso]] - 응용: [[Kalman-Filter-and-State-Tracking]] · [[Linear-Regression]] · [[Bundle-Adjustment]] ## 🤖 LLM 활용 **언제**: Linear/affine model fit, baseline regression, calibration curves. **언제 X**: Outliers 다수 (use Huber/RANSAC), heavy non-linearity (use NN/GP). ## ❌ 안티패턴 - **Normal equation 남용**: 매 ill-conditioned에서 매 silently 망함. - **Outlier 무시**: L2 loss는 매 outlier 민감 — robust loss 고려. - **Multicollinearity 방치**: VIF 점검 또는 Ridge. ## 🧪 검증 / 중복 - Verified (Trefethen & Bau "Numerical Linear Algebra"). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — OLS/Ridge/RLS patterns |