최적화

Least Squares (Sum of Squares Error)

kar7mp5 2025. 1. 25. 22:10
728x90

 

참고 문헌

௹ 오차제곱합 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$에 대해 미분한다.

௹ 미분 규칙

행렬 미분 과정에서 사용할 기본 규칙은 다음과 같다:

  1. 스칼라-벡터 곱 미분
    $$
    \frac{\partial}{\partial \beta} (\beta^T A) = A^T
    $$

단, $\beta$는 벡터이고 $A$는 행렬 또는 벡터이다.

  1. 벡터-스칼라 곱 미분
    $$
    \frac{\partial}{\partial \beta} (A \beta) = A
    $$
  2. 이차항 미분 (대칭 행렬일 때)
    $$
    \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)

 

 

728x90