study/Algorithm
[Algorithm] IRLS(Iteratively Reweighted Least Squares)
희김
2025. 4. 5. 16:23
IRLS(Iteratively Reweighted Least Squares)
IRLS는 최소제곱법(Least Squares)를 일반화하여, 반복적으로 가중치를 조정하면서 최적의 회귀 계수를 추정하는 알고리즘입니다. 여러 회귀 문제에서 사용되며 GLM에서 모델 적합과정에 주요하게 사용됩니다.
1. Objective of IRLS
- 회귀 계수 추정 문제
- GLM에서 $\beta$를 추정하려면, 가능도함수(Likelihood)를 최대화해야한다.
- 일반적으로 로그가능도 함수를 직접 최적화하는 것은 어렵다.
2. Basic Idea of IRLS
최소제곱법의 일반화.
- 최소제곱법(OLS):
- 선형회귀에서 우리는 잔차(Residual)의 제곱합을 최소화하는 것을 목표로 합니다.
- $$
argmin_{\beta} \sum_{i}^n\big(y_i - X_i\beta\big)^2
$$
- 가중최소제곱법(WLS):
- 잔차에 가중치를 부여하여 특정 데이터 포인트의 영향력을 조정합니다.
- $$
argmin_{\beta} \sum_{i}^nw_i\big(y_i - X_i\beta\big)^2
$$ - $w_i$는 각 관측치의 중요도를 나타내는 가중치
- IRLS:
- 가중치를 고정하지 않고, 반복적으로 데이터에 따라 가중치를 동적으로 조정합니다.
3. IRLS Algorithm
Step 1. 초기화
- 회귀 계수 $\beta$를 초기값으로 설정합니다.
- Linear Predictor $\eta$를 계산합니다.
- $\eta = X\beta$
- 연결함수 $g(\cdot)$와 그 역함수를 구합니다.
Step 2. 기댓값 계산
- 종속변수의 기댓값 $\mu$를 계산합니다.
- $\mu$는 종속변수의 예측값
- $g$는 종속변수의 분포에 따라 결정
- $\mu = g^{-1}(\eta)$
Step 3. 가중치 행렬 계산
- 분포의 특성에 따라 가중치를 동적으로 계산합니다.
- $W = \text{diag}\bigg(\dfrac{\partial \mu}{\partial \eta}\cdot\dfrac{1}{\text{var(Y)}}\bigg)$
- $\dfrac{\partial \mu}{\partial \eta}$ : 연결함수의 미분
- $\text{Var(Y)}$ : 종속 변수의 분산
Step 4. 잔차 계산
- IRLS는 잔차를 업데이트하여 잔여 정보를 반영합니다
- $z = \eta + W^{-1}(Y-\mu)$
- $z$ : Working Residual, 현재 모델이 설명하지 못한 데이터를 보정합니다.
Step 5. WLS 적용
- 가중최소제곱법을 사용하여 새로운 계수를 계산합니다.
- 새로운 계수 행렬 $\beta^{(t+1)}$을 계산합니다.
- $\beta^{(t+1)} = (X^TWX)^{-1}X^TWz$
Step 6. 수렴 조건 확인
- 반복적으로 $\beta$를 업데이트하며, 다음 조건을 만족하면 종료합니다.
- $||\beta^{(t+1)} - \beta^{(t)}|| <\epsilon$
Newton-Rapson 방법
- IRLS는 뉴런랩슨 방법을 기반으로 작동합니다.
- 로그가능도 함수 \ell(\beta) 를 최대화하기 위해 2차 테일러 전개를 사용합니다.
- $\beta^{(t+1)} = \beta^{(t)} - \left[ H(\beta^{(t)}) \right]^{-1} g(\beta^{(t)})$
• $g(\beta)$ : 로그가능도의 1차 미분(그래디언트).
• $H(\beta)$ : 로그가능도의 2차 미분(헤시안 행렬).
IRLS와의 연결
- 뉴턴-랩슨 방법의 업데이트 공식을 가중 최소제곱 문제로 변환한 것이 IRLS.
- 가중 행렬 W 는 헤시안 행렬의 근사치로 사용됩니다.
구현 예시
import numpy as np
# 샘플 데이터
X = np.array([[1, 0.5], [1, 2.3], [1, 1.8]]) # 독립 변수 (설정값)
y = np.array([0, 1, 1]) # 종속 변수 (관측값)
# 초기값 설정
beta = np.zeros(X.shape[1]) # 초기 회귀 계수
max_iter = 10 # 최대 반복 횟수
tol = 1e-6 # 수렴 기준
# IRLS 반복 과정
for _ in range(max_iter):
eta = np.dot(X, beta) # 선형 예측기
mu = 1 / (1 + np.exp(-eta)) # 로지스틱 함수 (예측값)
W = np.diag(mu * (1 - mu)) # 가중치 행렬
z = eta + np.dot(np.linalg.inv(W), y - mu) # 작업 잔차
beta_new = np.linalg.inv(X.T @ W @ X