← Back to Blog

[Convex Optimization] Least Squares

math > convex optimization

2026-07-042 min read

#math #convex-optimization #least-squares

참고 문헌: 잔차 제곱합 - 위키백과

오차제곱합 Sum of Squares Error(SSE)

SSE(Sum of Squared Errors)을 다음과 같은 행렬로 표현 가능하다.

SSE=i=1n(yiy^i)2=(yy^)T(yy^)SSE = \sum^{n}_{i=1}(y_i - \hat y_i)^2 = (y - \hat y)^T(y - \hat y)

SSESSE 함수는 다음과 같이 표현된다:

SSE=(yXβ)T(yXβ)SSE = (y - X\beta)^T (y - X\beta)

이를 전개하면:

SSE=yTy2βTXTy+βTXTXβSSE = y^T y - 2 \beta^T X^T y + \beta^T X^T X \beta

이제 β\beta에 대해 미분한다.

미분 규칙

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

β(βTA)=AT\frac{\partial}{\partial \beta} (\beta^T A) = A^T

단, β\beta는 벡터이고 AA는 행렬 또는 벡터이다.

β(Aβ)=A\frac{\partial}{\partial \beta} (A \beta) = A β(βTAβ)=2Aβ\frac{\partial}{\partial \beta} (\beta^T A \beta) = 2A \beta

단, AA가 대칭 행렬이어야 한다.

각 항 미분

첫 번째 항 yTyy^T y

yTyy^T y는 상수항(Scalar 값)입니다. 따라서 β\beta에 대해 미분하면:

β(yTy)=0\frac{\partial}{\partial \beta} (y^T y) = 0

두 번째 항 2βTXTy-2\beta^T X^T y

2βTXTy-2\beta^T X^T y는 벡터 β\beta와 행렬 XTX^T, 그리고 벡터 yy의 곱이다. 이 식을 β\beta에 대해 미분하면:

β(2βTXTy)=2XTy\frac{\partial}{\partial \beta} (-2 \beta^T X^T y) = -2 X^T y

여기서 미분 결과는 XTyX^T y로, 이는 행렬 XTX^T와 벡터 yy의 곱이다.

세 번째 항 βTXTXβ\beta^T X^T X \beta

βTXTXβ\beta^T X^T X \betaβ\beta의 이차항이다. 이 식을 미분하려면 대칭 행렬의 미분 공식을 사용한다:

β(βTAβ)=2Aβ단, A=XTX\frac{\partial}{\partial \beta} (\beta^T A \beta) = 2A \beta \quad \text{단, } A = X^T X

따라서:

β(βTXTXβ)=2XTXβ\frac{\partial}{\partial \beta} (\beta^T X^T X \beta) = 2 X^T X \beta

전체 미분 결과

각 항의 미분 결과를 조합하면:

βSSE=2XTy+2XTXβ\frac{\partial}{\partial \beta} SSE = -2 X^T y + 2 X^T X \beta

최적화 조건

최적화를 위해 미분값을 00으로 설정한다:

2XTy+2XTXβ=0-2 X^T y + 2 X^T X \beta = 0

양변을 22로 나누고 정리하면:

XTXβ=XTyX^T X \beta = X^T y

Beta 값 도출

위 식에서 β\beta를 구하기 위해 XTXX^T X의 역행렬을 곱한다:

β=(XTX)1XTy\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)

linear-regression