선형 회귀 분석은 관측된 데이터를 바탕으로 독립 변수와 종속 변수 간의 관계를 모델링하는 데 사용된다. 이 과정에서 회귀 계수를 구하는 방법 중 하나로 QR 분해를 활용할 수 있다. QR 분해는 수치적 안정성을 제공하며, 특히 대규모 데이터에서 효율적으로 계산할 수 있는 장점이 있다.
선형 회귀 분석의 기본 개념
선형 회귀 모델은 다음과 같은 형태로 정의된다:
여기서, - \mathbf{y}는 n \times 1 벡터로, 종속 변수(목표 변수)의 값을 나타낸다. - \mathbf{X}는 n \times p 행렬로, 각 행은 하나의 관측치, 각 열은 독립 변수(설명 변수)를 나타낸다. - \mathbf{\beta}는 p \times 1 벡터로, 회귀 계수를 나타낸다. - \mathbf{\epsilon}는 n \times 1 벡터로, 오차 항을 나타낸다.
회귀 계수 \mathbf{\beta}를 구하는 일반적인 방법은 최소 제곱법으로, 잔차(residual)의 제곱합을 최소화하는 \mathbf{\beta}를 찾는 것이다. 즉, 다음의 최적화 문제를 해결하는 것이다:
최소 제곱 문제와 QR 분해의 관계
최소 제곱 문제를 풀기 위해서는 보통 정규 방정식을 사용한다. 정규 방정식은 다음과 같이 나타낼 수 있다:
그러나 \mathbf{X}가 크거나 조건수가 나쁜 경우, 이 방법은 수치적으로 불안정할 수 있다. QR 분해는 이 문제를 해결하는 데 유용한 대안이 된다.
\mathbf{X}를 QR 분해하면, \mathbf{X} = \mathbf{Q} \mathbf{R}로 분해된다. 여기서, - \mathbf{Q}는 n \times p 직교 행렬 (혹은 n \times n 단위 행렬의 일부), - \mathbf{R}는 p \times p 상삼각 행렬이다.
이제, 선형 회귀 문제는 다음과 같이 변형될 수 있다:
이 방정식을 \mathbf{Q}^\top로 양변에 곱하면:
이제, \mathbf{R} \mathbf{\beta} = \mathbf{Q}^\top \mathbf{y}의 형태가 된다. 상삼각 행렬 \mathbf{R}은 역행렬을 쉽게 계산할 수 있으므로, \mathbf{\beta}는 다음과 같이 계산된다:
이 과정은 정규 방정식을 푸는 것보다 더 안정적이며, 특히 \mathbf{X}의 조건수가 클 때 유리한다.
QR 분해를 이용한 회귀 계수 계산 절차
QR 분해를 활용한 회귀 계수 계산 절차는 다음과 같다:
-
QR 분해: 행렬 \mathbf{X}를 \mathbf{X} = \mathbf{Q} \mathbf{R}로 분해한다.
-
\mathbf{Q}^\top \mathbf{y} 계산: \mathbf{Q}^\top \mathbf{y}를 계산하여, 이를 새로운 p \times 1 벡터 \mathbf{z}라고 정의한다.
- 후진 대입법: \mathbf{R} \mathbf{\beta} = \mathbf{z} 식에서 후진 대입법을 사용하여 \mathbf{\beta}를 계산한다.
- 결과 확인: 계산된 \mathbf{\beta} 값을 사용하여 모델의 적합성을 확인하고, 필요에 따라 모델을 수정하거나 추가 분석을 수행한다.
QR 분해를 활용한 수치적 안정성 확보
QR 분해는 특히 수치적 안정성 측면에서 유리한다. 정규 방정식을 풀 때 발생할 수 있는 수치적 문제를 효과적으로 방지할 수 있으며, 대규모 행렬에서도 효율적인 계산을 제공한다. QR 분해를 활용하면, 행렬 \mathbf{X}의 조건수가 나쁠 때도 신뢰할 수 있는 회귀 계수를 얻을 수 있다.
예제: QR 분해를 이용한 회귀 분석의 실제 적용
QR 분해를 이용한 회귀 분석을 예제로 살펴보겠다. Python의 NumPy 라이브러리를 사용하여 간단한 선형 회귀 분석을 수행해 보자.
예제 데이터
우선, 독립 변수와 종속 변수를 포함하는 예제 데이터를 생성한다. 이 데이터는 y = 2x_1 + 3x_2 + \epsilon의 형태로 가정된 모델에서 생성된 것으로 가정한다. 여기서 \epsilon은 노이즈(오차)이다.
import numpy as np
np.random.seed(0)
X = np.random.rand(100, 2) # 100개의 관측치와 2개의 독립 변수
beta_true = np.array([2, 3])
y = X @ beta_true + np.random.randn(100) * 0.5 # 노이즈 추가
QR 분해를 통한 회귀 계수 추정
이제 \mathbf{X}에 대한 QR 분해를 수행하고, 회귀 계수를 추정한다.
Q, R = np.linalg.qr(X)
z = Q.T @ y
beta_estimated = np.linalg.solve(R, z)
print("Estimated coefficients:", beta_estimated)
이 코드에서,
- np.linalg.qr(X)
는 \mathbf{X} = \mathbf{Q} \mathbf{R} 형태의 QR 분해를 수행한다.
- np.linalg.solve(R, z)
는 \mathbf{R} \mathbf{\beta} = \mathbf{z} 식을 풀어 회귀 계수를 계산한다.
결과 분석
계산된 \mathbf{\beta} 값은 실제 \mathbf{\beta}_{\text{true}} 값과 비교할 수 있다. 여기서 중요한 것은, 노이즈 \epsilon의 영향으로 인해 추정된 계수 \mathbf{\beta}_{\text{estimated}}가 실제 값 \mathbf{\beta}_{\text{true}}와 정확히 일치하지 않을 수 있지만, 최소 제곱 오차가 최소화된 값을 반환한다는 것이다.
QR 분해와 정규 방정식 비교
QR 분해를 통한 회귀 분석과 정규 방정식 방식을 비교하면, QR 분해는 더 높은 수치적 안정성을 제공한다. 이는 특히 행렬 \mathbf{X}의 조건수가 나쁘거나 행렬의 크기가 매우 클 때 중요한 이점이 된다. 정규 방정식을 풀 때 발생할 수 있는 문제 중 하나는 \mathbf{X}^\top \mathbf{X} 행렬이 매우 큰 값이나 작은 값을 가질 때, 이로 인해 계산 오차가 증폭될 수 있다는 점이다. QR 분해는 이 문제를 피할 수 있다.
정규화된 독립 변수와 QR 분해
회귀 분석에서는 독립 변수를 정규화하는 것이 일반적이다. 이는 모델의 해석 가능성을 높이고, QR 분해의 수치적 안정성을 더욱 개선할 수 있다. 독립 변수 \mathbf{X}를 정규화하면, QR 분해를 통해 얻은 회귀 계수의 의미를 더 명확히 이해할 수 있다.
정규화된 독립 변수를 사용한 QR 분해는 다음과 같은 추가 단계가 필요하다: 1. 독립 변수 \mathbf{X}의 각 열을 평균 0, 분산 1로 정규화한다. 2. 정규화된 \mathbf{X}를 QR 분해에 사용하여 회귀 계수를 계산한다. 3. 정규화된 계수를 원래 척도로 변환하여 해석한다.
QR 분해의 장단점 요약
QR 분해를 이용한 선형 회귀 분석은 다음과 같은 장점을 제공한다: - 수치적 안정성: 행렬 \mathbf{X}의 조건수가 나쁘더라도 안정적인 계산이 가능. - 효율성: 특히 대규모 데이터셋에서 더 빠르고 정확한 계산이 가능. - 간편한 후진 대입법: 상삼각 행렬을 사용한 간단한 계산으로 회귀 계수를 추정.
그러나 몇 가지 단점도 존재한다: - 계산 복잡도: QR 분해 자체의 계산 복잡도가 존재하며, 이로 인해 매우 큰 데이터셋에서는 계산 시간이 증가할 수 있음. - 추가 메모리 사용: \mathbf{Q}와 \mathbf{R} 행렬을 저장하기 위해 추가 메모리가 필요함.
이러한 장단점을 고려하여, QR 분해는 일반적으로 데이터셋이 크거나 독립 변수 사이에 다중 공선성이 존재할 때, 또는 수치적 안정성이 중요한 경우에 선호된다.
QR 분해는 선형 회귀 분석에서 매우 유용한 도구로, 특히 계산의 안정성과 효율성을 요구하는 상황에서 중요한 역할을 한다. 이를 통해 정확하고 신뢰할 수 있는 회귀 모델을 구축할 수 있으며, 다양한 응용 분야에서 활용될 수 있다.