Least Squares (Sum of Squares Error)
௹ 오차제곱합 Sum of Squares Error(SSE)
SSE(Sum of Squared Errors)
을 다음과 같은 행렬로 표현 가능하다.
$$
SSE = \sum^{n}_{i=1}(y_i - \hat y_i)^2 = (y - \hat y)^T(y - \hat y)
$$
$SSE$ 함수는 다음과 같이 표현된다:
$$
SSE = (y - X\beta)^T (y - X\beta)
$$
이를 전개하면:
$$
SSE = y^T y - 2 \beta^T X^T y + \beta^T X^T X \beta
$$
이제 $\beta$에 대해 미분한다.
௹ 미분 규칙
행렬 미분 과정에서 사용할 기본 규칙은 다음과 같다:
- 스칼라-벡터 곱 미분
$$
\frac{\partial}{\partial \beta} (\beta^T A) = A^T
$$
단, $\beta$는 벡터이고 $A$는 행렬 또는 벡터이다.
- 벡터-스칼라 곱 미분
$$
\frac{\partial}{\partial \beta} (A \beta) = A
$$ - 이차항 미분 (대칭 행렬일 때)
$$
\frac{\partial}{\partial \beta} (\beta^T A \beta) = 2A \beta
$$
단, $A$가 대칭 행렬이어야 한다.
௹ 각 항 미분
첫 번째 항 $y^T y$
$y^T y$는 상수항(Scalar
값)입니다. 따라서 $\beta$에 대해 미분하면:
$$
\frac{\partial}{\partial \beta} (y^T y) = 0
$$
두 번째 항 $-2\beta^T X^T y$
$-2\beta^T X^T y$는 벡터 $\beta$와 행렬 $X^T$, 그리고 벡터 $y$의 곱이다. 이 식을 $\beta$에 대해 미분하면:
$$
\frac{\partial}{\partial \beta} (-2 \beta^T X^T y) = -2 X^T y
$$
여기서 미분 결과는 $X^T y$로, 이는 행렬 $X^T$와 벡터 $y$의 곱이다.
세 번째 항 $\beta^T X^T X \beta$
$\beta^T X^T X \beta$는 $\beta$의 이차항이다. 이 식을 미분하려면 대칭 행렬의 미분 공식을 사용한다:
$$
\frac{\partial}{\partial \beta} (\beta^T A \beta) = 2A \beta \quad \text{(단, (A = X^T X))}
$$
따라서:
$$
\frac{\partial}{\partial \beta} (\beta^T X^T X \beta) = 2 X^T X \beta
$$
௹ 전체 미분 결과
각 항의 미분 결과를 조합하면:
$$
\frac{\partial}{\partial \beta} SSE = -2 X^T y + 2 X^T X \beta
$$
௹ 최적화 조건
최적화를 위해 미분값을 $0$으로 설정한다:
$$
-2 X^T y + 2 X^T X \beta = 0
$$
양변을 $2$로 나누고 정리하면:
$$
X^T X \beta = X^T y
$$
௹ $\beta$ 값 도출
위 식에서 $\beta$를 구하기 위해 $X^T X$의 역행렬을 곱한다:
$$
\beta = (X^T X)^{-1} X^T y
$$
import numpy as np
# Define the input matrix X and target vector y
X = np.array([[1, 1], # Example: Add a bias term (column of 1s) for intercept
[1, 2],
[1, 3],
[1, 4]])
y = np.array([6, 5, 7, 10]) # Target values
# Calculate beta using the normal equation: beta = (X^T X)^(-1) X^T y
X_transpose = X.T
beta = np.linalg.inv(X_transpose @ X) @ X_transpose @ y
# Print the resulting beta
print("Calculated beta coefficients:")
print(beta)
# Verify the predicted values
y_pred = X @ beta
print("\nPredicted values:")
print(y_pred)
# Calculate the Sum of Squared Errors (SSE)
sse = np.sum((y - y_pred) ** 2)
print("\nSum of Squared Errors (SSE):")
print(sse)