정규방정식
개요
정규방정식(Normal Equation)은 선형회귀(Linear Regression) 문제를 해결하기 위한 해석적(analytical) 방법 중 하나로, 최소제곱법(Least Squares Method)을 사용하여 선형 모델의 계수를 직접 계산하는 수식이다. 이 방정식은 손실 함수인 잔차 제곱합(Sum of Squared Residuals)을 최소화하는 최적의 파라미터를 행렬 연산을 통해 구할 수 있게 해준다. 정규방정식은 기울기 하강법(Gradient Descent)과 같은 반복적 최적화 방법과 달리 반복 없이 한 번의 계산으로 해를 구할 수 있다는 장점이 있다.
정규방정식은 특히 변수의 수가 많지 않고 데이터 크기가 적당할 때 유용하며, 머신러닝, 통계학, 공학 등 다양한 분야에서 활용된다.
수학적 정의
선형회귀 모델은 다음과 같은 형태로 표현된다:
[
\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}
]
여기서:
- (\mathbf{y} \in \mathbb{R}^n): 관측된 종속 변수 벡터 (응답 변수)
- (\mathbf{X} \in \mathbb{R}^{n \times p}): 독립 변수(설명 변수)의 설계 행렬 (Design Matrix)
- (\boldsymbol{\beta} \in \mathbb{R}^p): 추정하고자 하는 회귀 계수 벡터
- (\boldsymbol{\varepsilon} \in \mathbb{R}^n): 오차 벡터
우리는 잔차 제곱합(Sum of Squared Residuals):
[
L(\boldsymbol{\beta}) = |\mathbf{y} - \mathbf{X}\boldsymbol{\beta}|^2 = (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})^\top (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})
]
를 최소화하는 (\boldsymbol{\beta})를 찾고자 한다. 이를 위해 (L(\boldsymbol{\beta}))를 (\boldsymbol{\beta})에 대해 미분하고 0으로 놓는 과정을 거치면 다음의 정규방정식을 얻는다:
[
\mathbf{X}^\top \mathbf{X} \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y}
]
이 방정식의 해는 다음과 같이 주어진다:
[
\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}
]
이 해는 (\mathbf{X}^\top \mathbf{X})가 가역(invertible)할 때 존재하며, 이 조건은 (\mathbf{X})의 열들이 선형 독립일 경우 만족된다.
정규방정식의 특성과 장단점
장점
- 해석적 해 제공: 반복 없이 한 번의 행렬 계산으로 최적 해를 구할 수 있음.
- 정확한 해: 수치적 오차가 적고, 해가 존재하면 정확한 최소제곱 해를 제공.
- 구현이 간단함: 행렬 연산만으로 구현 가능 (예: NumPy, MATLAB).
단점
- 계산 복잡도가 높음: (\mathbf{X}^\top \mathbf{X})의 역행렬을 계산해야 하므로, 변수 수 (p)가 클 경우 (O(p^3))의 시간 복잡도가 필요.
- 메모리 사용량 큼: 대규모 데이터셋에서는 메모리 부족 문제가 발생할 수 있음.
- (\mathbf{X}^\top \mathbf{X}) 가역성 보장 안됨: 변수 간 다중공선성(multicollinearity)이 있거나, (n < p)인 경우 역행렬이 존재하지 않음.
🔍 참고: (n)은 샘플 수, (p)는 변수(특성) 수.
정규방정식과 기울기 하강법 비교
| 항목 |
정규방정식 |
기울기 하강법 |
| 해의 형태 |
해석적 해 |
반복적 근사 해 |
| 계산 방식 |
행렬 역연산 |
반복적 업데이트 |
| 시간 복잡도 |
(O(p^3)) |
(O(knp)), (k): 반복 횟수 |
| 메모리 요구 |
높음 |
낮음 |
| 데이터 크기 적합성 |
소규모 |
대규모 |
| 다중공선성 처리 |
어려움 |
정규화로 완화 가능 |
정규화된 정규방정식 (Ridge 회귀)
다중공선성이나 과적합(overfitting) 문제를 해결하기 위해 정규방정식을 확장한 형태가 리지 회귀(Ridge Regression)이다. 이 경우 목적 함수에 L2 정규화 항이 추가된다:
[
L(\boldsymbol{\beta}) = |\mathbf{y} - \mathbf{X}\boldsymbol{\beta}|^2 + \lambda |\boldsymbol{\beta}|^2
]
이에 대한 정규방정식은 다음과 같다:
[
(\mathbf{X}^\top \mathbf{X} + \lambda \mathbf{I}) \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y}
]
해는:
[
\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X} + \lambda \mathbf{I})^{-1} \mathbf{X}^\top \mathbf{y}
]
여기서 (\lambda > 0)은 정규화 강도를 조절하는 하이퍼파라미터이며, (\mathbf{I})는 단위행렬이다. 이 방법은 (\mathbf{X}^\top \mathbf{X})가 특이행렬(singular matrix)일 경우에도 역행렬을 안정적으로 구할 수 있도록 해준다.
활용 예시 (Python 코드)
import numpy as np
# 예시 데이터 생성
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]]) # 절편 항 포함
y = np.array([2, 3, 5, 7])
# 정규방정식 적용
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ y
print("추정된 계수:", beta_hat)
출력:
이 경우 모델은 (y = 0.5 + 1.6x) 형태의 직선이다.
관련 개념
- 최소제곱법(Least Squares)
- 행렬의 가역성(Matrix Invertibility)
- 다중공선성(Multicollinearity)
- 특잇값 분해(Singular Value Decomposition, SVD): 정규방정식의 수치적 안정성을 높이기 위한 대안
- 의사역행렬(Pseudo-inverse): (\mathbf{X}^\top \mathbf{X})가 비가역일 때 사용
가역성 조건과 Full Column Rank
정규방정식의 해 $\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}$가 유일하게 존재하기 위해서는 행렬 $\mathbf{X}^\top \mathbf{X}$가 가역 행렬(Invertible Matrix)이어야 한다. 이를 위한 필요충분조건은 설계 행렬 $\mathbf{X} \in \mathbb{R}^{n \times p}$가 Full Column Rank를 갖는 것이다.
즉, $\text{rank}(\mathbf{X}) = p$여야 하며, 이는 $\mathbf{X}$의 모든 열 벡터들이 서로 선형 독립(Linearly Independent)임을 의미한다. 만약 변수 간에 강한 상관관계가 있는 다중공선성 문제가 발생하여 $\text{rank}(\mathbf{X}) < p$가 되면, $\mathbf{X}^\top \mathbf{X}$는 특이 행렬(Singular Matrix)이 되어 역행렬이 존재하지 않으며, 해가 무수히 많아지거나 수치적으로 불안정해진다.
수치적 안정성과 조건수(Condition Number)
정규방정식을 이용한 계산 시, $\mathbf{X}^\top \mathbf{X}$의 역행렬을 직접 구하는 것은 수치적으로 위험할 수 있다. 이때 행렬의 안정성을 평가하는 지표가 조건수(Condition Number)이다.
행렬 $\mathbf{A} = \mathbf{X}^\top \mathbf{X}$의 조건수는 다음과 같이 정의된다:
[
\kappa(\mathbf{A}) = |\mathbf{A}| \cdot |\mathbf{A}^{-1}| = \frac{\sigma_{\max}(\mathbf{A})}{\sigma_{\min}(\mathbf{A})}
]
(여기서 $\sigma_{\max}, \sigma_{\min}$은 각각 $\mathbf{A}$의 최대 및 최소 특잇값이다.)
조건수가 매우 큰 행렬을 불량 조건 행렬(Ill-conditioned Matrix)이라고 하며, 이 경우 입력 데이터 $\mathbf{y}$의 아주 작은 변화가 결과값 $\boldsymbol{\hat{\beta}}$에 매우 큰 오차를 유발한다. 특히 $\mathbf{X}$의 조건수가 $\kappa(\mathbf{X})$일 때, $\mathbf{X}^\top \mathbf{X}$의 조건수는 $\kappa(\mathbf{X})^2$이 되어 수치적 불안정성이 제곱으로 증폭된다.
기하학적 해석: 정사영(Projection)
정규방정식의 본질은 종속 변수 벡터 $\mathbf{y}$를 독립 변수들의 열 공간(Column Space, $\text{col}(\mathbf{X})$)으로 정사영(Projection)시키는 과정이다.
[기하학적 도식도]
1. 공간 설정: $\mathbb{R}^n$ 공간 내에 $\mathbf{X}$의 열 벡터들이 생성하는 $p$차원 부분 공간(Hyperplane)이 존재한다.
2. 벡터 $\mathbf{y}$: 실제 관측값 $\mathbf{y}$는 일반적으로 이 부분 공간 밖에 위치한다.
3. 최단 거리: $\mathbf{y}$에서 부분 공간으로 내린 수선의 발 $\hat{\mathbf{y}} = \mathbf{X}\boldsymbol{\hat{\beta}}$이 바로 예측값이다.
4. 직교성: 이때 잔차 벡터 $\mathbf{e} = \mathbf{y} - \hat{\mathbf{y}}$는 부분 공간 $\text{col}(\mathbf{X})$와 직교(Orthogonal)한다.
- $\mathbf{X}^\top (\mathbf{y} - \mathbf{X}\boldsymbol{\hat{\beta}}) = 0 \implies \mathbf{X}^\top \mathbf{X} \boldsymbol{\hat{\beta}} = \mathbf{X}^\top \mathbf{y}$
이 직교 조건이 바로 정규방정식의 유도 근거가 되며, $\hat{\mathbf{y}}$는 $\mathbf{y}$에 가장 가까운(L2 거리 최소) 부분 공간 내의 점이 된다.
수치적 안정성과 의사역행렬(Pseudo-inverse)
$\mathbf{X}^\top \mathbf{X}$가 가역적이지 않거나 조건수가 너무 커서 수치적으로 불안정한 경우, Moore-Penrose 의사역행렬(Pseudo-inverse) $\mathbf{X}^+$를 사용하여 해를 구한다:
[
\boldsymbol{\hat{\beta}} = \mathbf{X}^+ \mathbf{y}
]
SVD를 이용한 해 도출 과정
의사역행렬은 특잇값 분해(SVD)를 통해 계산되며, 과정은 다음과 같다:
- SVD 수행: $\mathbf{X}$를 $\mathbf{X} = \mathbf{U}\boldsymbol{\Sigma}\mathbf{V}^\top$로 분해한다.
- $\mathbf{U}$: $n \times n$ 직교행렬
- $\boldsymbol{\Sigma}$: $n \times p$ 대각행렬 (특잇값 $\sigma_i$ 포함)
- $\mathbf{V}$: $p \times p$ 직교행렬
- $\boldsymbol{\Sigma}^+$ 계산: $\boldsymbol{\Sigma}$의 0이 아닌 대각 성분 $\sigma_i$를 $1/\sigma_i$로 역수를 취하고 전치시킨다.
- 의사역행렬 구성: $\mathbf{X}^+ = \mathbf{V}\boldsymbol{\Sigma}^+ \mathbf{U}^\top$를 계산한다.
- 최종 해 도출: $\boldsymbol{\hat{\beta}} = \mathbf{V}\boldsymbol{\Sigma}^+ \mathbf{U}^\top \mathbf{y}$를 통해 최소제곱해를 구한다.
이 방법은 $\mathbf{X}$가 Full Rank가 아니더라도 항상 유일한 최소 노름 해(Minimum Norm Solution)를 제공하며, 매우 작은 특잇값을 0으로 처리함으로써 수치적 안정성을 확보할 수 있다.
실무적 구현 가이드 (Python)
실무에서는 np.linalg.inv를 사용하여 역행렬을 직접 계산하는 것보다, 내부적으로 SVD나 QR 분해를 사용하는 np.linalg.lstsq 함수를 사용하는 것이 훨씬 안정적이고 빠르다.
import numpy as np
# 예시 데이터 생성
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])
y = np.array([2, 3, 5, 7])
# 방법 1: 정규방정식 직접 계산 (수치적으로 불안정할 수 있음)
beta_inv = np.linalg.inv(X.T @ X) @ X.T @ y
# 방법 2: np.linalg.lstsq 사용 (SVD 기반, 수치적으로 안정적)
# rcond=None은 머신 정밀도에 따른 임계값을 자동으로 설정함
beta_lstsq, residuals, rank, s = np.linalg.lstsq(X, y, rcond=None)
print("직접 계산 계수:", beta_inv)
print("lstsq 계산 계수:", beta_lstsq)
참고 자료
- Strang, G. (2016). Introduction to Linear Algebra (5th ed.). Wellesley-Cambridge Press.
- Boyd, S., & Vandenberghe, L. (2018). Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares. Cambridge University Press.
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
- NumPy Documentation - linalg.inv
정규방정식은 선형대수의 핵심 응용 사례 중 하나로, 이론적 깊이와 실용적 가치를 동시에 지닌 중요한 도구이다.
# 정규방정식
## 개요
정규방정식(Normal Equation)은 **선형회귀**(Linear Regression) 문제를 해결하기 위한 해석적(analytical) 방법 중 하나로, 최소제곱법(Least Squares Method)을 사용하여 선형 모델의 계수를 직접 계산하는 수식이다. 이 방정식은 손실 함수인 **잔차 제곱합**(Sum of Squared Residuals)을 최소화하는 최적의 파라미터를 행렬 연산을 통해 구할 수 있게 해준다. 정규방정식은 기울기 하강법(Gradient Descent)과 같은 반복적 최적화 방법과 달리 반복 없이 한 번의 계산으로 해를 구할 수 있다는 장점이 있다.
정규방정식은 특히 변수의 수가 많지 않고 데이터 크기가 적당할 때 유용하며, 머신러닝, 통계학, 공학 등 다양한 분야에서 활용된다.
---
## 수학적 정의
선형회귀 모델은 다음과 같은 형태로 표현된다:
\[
\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}
\]
여기서:
- \(\mathbf{y} \in \mathbb{R}^n\): 관측된 종속 변수 벡터 (응답 변수)
- \(\mathbf{X} \in \mathbb{R}^{n \times p}\): 독립 변수(설명 변수)의 설계 행렬 (Design Matrix)
- \(\boldsymbol{\beta} \in \mathbb{R}^p\): 추정하고자 하는 회귀 계수 벡터
- \(\boldsymbol{\varepsilon} \in \mathbb{R}^n\): 오차 벡터
우리는 잔차 제곱합(Sum of Squared Residuals):
\[
L(\boldsymbol{\beta}) = \|\mathbf{y} - \mathbf{X}\boldsymbol{\beta}\|^2 = (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})^\top (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})
\]
를 최소화하는 \(\boldsymbol{\beta}\)를 찾고자 한다. 이를 위해 \(L(\boldsymbol{\beta})\)를 \(\boldsymbol{\beta}\)에 대해 미분하고 0으로 놓는 과정을 거치면 다음의 **정규방정식**을 얻는다:
\[
\mathbf{X}^\top \mathbf{X} \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y}
\]
이 방정식의 해는 다음과 같이 주어진다:
\[
\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}
\]
이 해는 \(\mathbf{X}^\top \mathbf{X}\)가 **가역**(invertible)할 때 존재하며, 이 조건은 \(\mathbf{X}\)의 열들이 선형 독립일 경우 만족된다.
---
## 정규방정식의 특성과 장단점
### 장점
1. **해석적 해 제공**: 반복 없이 한 번의 행렬 계산으로 최적 해를 구할 수 있음.
2. **정확한 해**: 수치적 오차가 적고, 해가 존재하면 정확한 최소제곱 해를 제공.
3. **구현이 간단함**: 행렬 연산만으로 구현 가능 (예: NumPy, MATLAB).
### 단점
1. **계산 복잡도가 높음**: \(\mathbf{X}^\top \mathbf{X}\)의 역행렬을 계산해야 하므로, 변수 수 \(p\)가 클 경우 \(O(p^3)\)의 시간 복잡도가 필요.
2. **메모리 사용량 큼**: 대규모 데이터셋에서는 메모리 부족 문제가 발생할 수 있음.
3. \(\mathbf{X}^\top \mathbf{X}\) **가역성 보장 안됨**: 변수 간 다중공선성(multicollinearity)이 있거나, \(n < p\)인 경우 역행렬이 존재하지 않음.
> 🔍 **참고**: \(n\)은 샘플 수, \(p\)는 변수(특성) 수.
---
## 정규방정식과 기울기 하강법 비교
| 항목 | 정규방정식 | 기울기 하강법 |
|------|------------|----------------|
| 해의 형태 | 해석적 해 | 반복적 근사 해 |
| 계산 방식 | 행렬 역연산 | 반복적 업데이트 |
| 시간 복잡도 | \(O(p^3)\) | \(O(knp)\), \(k\): 반복 횟수 |
| 메모리 요구 | 높음 | 낮음 |
| 데이터 크기 적합성 | 소규모 | 대규모 |
| 다중공선성 처리 | 어려움 | 정규화로 완화 가능 |
---
## 정규화된 정규방정식 (Ridge 회귀)
다중공선성이나 과적합(overfitting) 문제를 해결하기 위해 정규방정식을 확장한 형태가 **리지 회귀**(Ridge Regression)이다. 이 경우 목적 함수에 L2 정규화 항이 추가된다:
\[
L(\boldsymbol{\beta}) = \|\mathbf{y} - \mathbf{X}\boldsymbol{\beta}\|^2 + \lambda \|\boldsymbol{\beta}\|^2
\]
이에 대한 정규방정식은 다음과 같다:
\[
(\mathbf{X}^\top \mathbf{X} + \lambda \mathbf{I}) \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y}
\]
해는:
\[
\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X} + \lambda \mathbf{I})^{-1} \mathbf{X}^\top \mathbf{y}
\]
여기서 \(\lambda > 0\)은 정규화 강도를 조절하는 하이퍼파라미터이며, \(\mathbf{I}\)는 단위행렬이다. 이 방법은 \(\mathbf{X}^\top \mathbf{X}\)가 특이행렬(singular matrix)일 경우에도 역행렬을 안정적으로 구할 수 있도록 해준다.
---
## 활용 예시 (Python 코드)
```python
import numpy as np
# 예시 데이터 생성
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]]) # 절편 항 포함
y = np.array([2, 3, 5, 7])
# 정규방정식 적용
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ y
print("추정된 계수:", beta_hat)
```
출력:
```
추정된 계수: [0.5 1.6]
```
이 경우 모델은 \(y = 0.5 + 1.6x\) 형태의 직선이다.
---
## 관련 개념
- **최소제곱법**(Least Squares)
- **행렬의 가역성**(Matrix Invertibility)
- **다중공선성**(Multicollinearity)
- **특잇값 분해**(Singular Value Decomposition, SVD): 정규방정식의 수치적 안정성을 높이기 위한 대안
- **의사역행렬**(Pseudo-inverse): \(\mathbf{X}^\top \mathbf{X}\)가 비가역일 때 사용
---
## 가역성 조건과 Full Column Rank
정규방정식의 해 $\boldsymbol{\hat{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}$가 유일하게 존재하기 위해서는 행렬 $\mathbf{X}^\top \mathbf{X}$가 가역 행렬(Invertible Matrix)이어야 한다. 이를 위한 필요충분조건은 설계 행렬 $\mathbf{X} \in \mathbb{R}^{n \times p}$가 **Full Column Rank**를 갖는 것이다.
즉, $\text{rank}(\mathbf{X}) = p$여야 하며, 이는 $\mathbf{X}$의 모든 열 벡터들이 서로 선형 독립(Linearly Independent)임을 의미한다. 만약 변수 간에 강한 상관관계가 있는 다중공선성 문제가 발생하여 $\text{rank}(\mathbf{X}) < p$가 되면, $\mathbf{X}^\top \mathbf{X}$는 특이 행렬(Singular Matrix)이 되어 역행렬이 존재하지 않으며, 해가 무수히 많아지거나 수치적으로 불안정해진다.
## 수치적 안정성과 조건수(Condition Number)
정규방정식을 이용한 계산 시, $\mathbf{X}^\top \mathbf{X}$의 역행렬을 직접 구하는 것은 수치적으로 위험할 수 있다. 이때 행렬의 안정성을 평가하는 지표가 **조건수(Condition Number)**이다.
행렬 $\mathbf{A} = \mathbf{X}^\top \mathbf{X}$의 조건수는 다음과 같이 정의된다:
\[
\kappa(\mathbf{A}) = \|\mathbf{A}\| \cdot \|\mathbf{A}^{-1}\| = \frac{\sigma_{\max}(\mathbf{A})}{\sigma_{\min}(\mathbf{A})}
\]
(여기서 $\sigma_{\max}, \sigma_{\min}$은 각각 $\mathbf{A}$의 최대 및 최소 특잇값이다.)
조건수가 매우 큰 행렬을 **불량 조건 행렬(Ill-conditioned Matrix)**이라고 하며, 이 경우 입력 데이터 $\mathbf{y}$의 아주 작은 변화가 결과값 $\boldsymbol{\hat{\beta}}$에 매우 큰 오차를 유발한다. 특히 $\mathbf{X}$의 조건수가 $\kappa(\mathbf{X})$일 때, $\mathbf{X}^\top \mathbf{X}$의 조건수는 $\kappa(\mathbf{X})^2$이 되어 수치적 불안정성이 제곱으로 증폭된다.
## 기하학적 해석: 정사영(Projection)
정규방정식의 본질은 종속 변수 벡터 $\mathbf{y}$를 독립 변수들의 열 공간(Column Space, $\text{col}(\mathbf{X})$)으로 **정사영(Projection)**시키는 과정이다.
**[기하학적 도식도]**
1. **공간 설정**: $\mathbb{R}^n$ 공간 내에 $\mathbf{X}$의 열 벡터들이 생성하는 $p$차원 부분 공간(Hyperplane)이 존재한다.
2. **벡터 $\mathbf{y}$**: 실제 관측값 $\mathbf{y}$는 일반적으로 이 부분 공간 밖에 위치한다.
3. **최단 거리**: $\mathbf{y}$에서 부분 공간으로 내린 수선의 발 $\hat{\mathbf{y}} = \mathbf{X}\boldsymbol{\hat{\beta}}$이 바로 예측값이다.
4. **직교성**: 이때 잔차 벡터 $\mathbf{e} = \mathbf{y} - \hat{\mathbf{y}}$는 부분 공간 $\text{col}(\mathbf{X})$와 직교(Orthogonal)한다.
- $\mathbf{X}^\top (\mathbf{y} - \mathbf{X}\boldsymbol{\hat{\beta}}) = 0 \implies \mathbf{X}^\top \mathbf{X} \boldsymbol{\hat{\beta}} = \mathbf{X}^\top \mathbf{y}$
이 직교 조건이 바로 정규방정식의 유도 근거가 되며, $\hat{\mathbf{y}}$는 $\mathbf{y}$에 가장 가까운(L2 거리 최소) 부분 공간 내의 점이 된다.
## 수치적 안정성과 의사역행렬(Pseudo-inverse)
$\mathbf{X}^\top \mathbf{X}$가 가역적이지 않거나 조건수가 너무 커서 수치적으로 불안정한 경우, **Moore-Penrose 의사역행렬(Pseudo-inverse)** $\mathbf{X}^+$를 사용하여 해를 구한다:
\[
\boldsymbol{\hat{\beta}} = \mathbf{X}^+ \mathbf{y}
\]
### SVD를 이용한 해 도출 과정
의사역행렬은 **특잇값 분해(SVD)**를 통해 계산되며, 과정은 다음과 같다:
1. **SVD 수행**: $\mathbf{X}$를 $\mathbf{X} = \mathbf{U}\boldsymbol{\Sigma}\mathbf{V}^\top$로 분해한다.
- $\mathbf{U}$: $n \times n$ 직교행렬
- $\boldsymbol{\Sigma}$: $n \times p$ 대각행렬 (특잇값 $\sigma_i$ 포함)
- $\mathbf{V}$: $p \times p$ 직교행렬
2. **$\boldsymbol{\Sigma}^+$ 계산**: $\boldsymbol{\Sigma}$의 0이 아닌 대각 성분 $\sigma_i$를 $1/\sigma_i$로 역수를 취하고 전치시킨다.
3. **의사역행렬 구성**: $\mathbf{X}^+ = \mathbf{V}\boldsymbol{\Sigma}^+ \mathbf{U}^\top$를 계산한다.
4. **최종 해 도출**: $\boldsymbol{\hat{\beta}} = \mathbf{V}\boldsymbol{\Sigma}^+ \mathbf{U}^\top \mathbf{y}$를 통해 최소제곱해를 구한다.
이 방법은 $\mathbf{X}$가 Full Rank가 아니더라도 항상 유일한 최소 노름 해(Minimum Norm Solution)를 제공하며, 매우 작은 특잇값을 0으로 처리함으로써 수치적 안정성을 확보할 수 있다.
## 실무적 구현 가이드 (Python)
실무에서는 `np.linalg.inv`를 사용하여 역행렬을 직접 계산하는 것보다, 내부적으로 SVD나 QR 분해를 사용하는 `np.linalg.lstsq` 함수를 사용하는 것이 훨씬 안정적이고 빠르다.
```python
import numpy as np
# 예시 데이터 생성
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4]])
y = np.array([2, 3, 5, 7])
# 방법 1: 정규방정식 직접 계산 (수치적으로 불안정할 수 있음)
beta_inv = np.linalg.inv(X.T @ X) @ X.T @ y
# 방법 2: np.linalg.lstsq 사용 (SVD 기반, 수치적으로 안정적)
# rcond=None은 머신 정밀도에 따른 임계값을 자동으로 설정함
beta_lstsq, residuals, rank, s = np.linalg.lstsq(X, y, rcond=None)
print("직접 계산 계수:", beta_inv)
print("lstsq 계산 계수:", beta_lstsq)
```
## 참고 자료
1. Strang, G. (2016). *Introduction to Linear Algebra* (5th ed.). Wellesley-Cambridge Press.
2. Boyd, S., & Vandenberghe, L. (2018). *Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares*. Cambridge University Press.
3. Bishop, C. M. (2006). *Pattern Recognition and Machine Learning*. Springer.
4. [NumPy Documentation - linalg.inv](https://numpy.org/doc/stable/reference/generated/numpy.linalg.inv.html)
---
정규방정식은 선형대수의 핵심 응용 사례 중 하나로, 이론적 깊이와 실용적 가치를 동시에 지닌 중요한 도구이다.