심드렁하게 저장

모수추정 방법 두 가지 - Maximum Likelihood Estimation & Maximum A Posteriori 본문

Artificial intelligence/AI Fundamental

모수추정 방법 두 가지 - Maximum Likelihood Estimation & Maximum A Posteriori

Ggoosae 2025. 2. 17. 23:36

1. Maximum Likelihood Estimation - 최대 가능도 추정

  • 최대가능도 추정은 주어진 데이터로부터 모수를 추정하는 방법으로 데이터를 가장 잘 설명하는 파라미터를 찾는다.
  • 여기서 모수란 모평균, 모분산같이 모집단 확률 분포의 특성을 나타내느 대푯값을 의미한다.
  • 또한 가능도는 확률 분포에서 모수, 즉 파라미터를 고정하였을 때 샘플 데이터를 얻을 확률을 의미한다.
  • 가능도가 높다는 말은 고정된 파라미터에서 해당 데이터 표본들이 수집될 확률이 높다는 뜻이며, 추정된 모수가 실제 값일 확률이 높다는 의미이기도 하다.
  • 확률 변수 X에 대한 결합 확률 밀도 함수는 가능도 함수로 표현할 수 있다. 이를 파라미터 관점으로 재해석하여 가능도를 최대화하기위한 세타를 찾는 과정은 다음과 같다.

MLE

2. Maximum A Posteriori - 최대 사후 확률

  • 최대 사후 확률 추정은 베이즈 정리를 활용하여 주어진 데이터로부터 모수를 추정하는 방법이다.
  • MAP 추정은 사전 확률(prior)을 고려하여 모수를 추정한다는 점에서 최대 가능도 추정과 차이가 있다.
  • 즉, 단순히 데이터를 가장 잘 설명하는 모수를 찾는 것이 아니라, 사전 정보까지 반영하여 모수를 추정하는 것이다.
  • MAP 추정에서 우리가 원하는 것은 데이터 X가 주어졌을때 모수 세타가 가장 클 확률을 가지는 값을 찾는 것이다. 이를 수식으로 표현하면 다음과 같다.
  •  

MAP

  • 즉, 가능도 함수와 사전 확률의 곱을 최대화하는 모수를 찾는 것이 MAP 추정의 목적이다.

3. 코드 예제

아래는 MLE (Maximum Likelihood Estimation)MAP (Maximum A Posteriori Estimation) 을 비교하는 Python 코드이다. 정규 분포를 가정하고, 주어진 샘플 데이터에서 평균(μ)을 추정하는 예제이다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 샘플 데이터 생성 (Ground truth: 평균=5, 분산 = 2)
np.random.seed(42)
true_mu = 5
true_sigma = 2
n_samples = 30

# 정규 분포에서 30개의 샘플을 생성
samples = np.random.normal(true_mu, true_sigma, n_samples)

# MLE 추정(가능도 최대화: 단순히 샘플 평균을 사용)
mle_mu = np.mean(samples)

# MAP 추정 (사전 확률 고려: 정규분포 사전 정보)
prior_mu = 4  # 사전 평균
prior_sigma = 1  # 사전 표준편차 (신뢰도)

# MAP 공식
map_mu = (n_samples * mle_mu / true_sigma**2 + prior_mu * true_mu/prior_sigma**2)/ (n_samples / true_sigma**2 + 1 / prior_sigma**2)

# 결과 출력
print(f"MLE 추정 (μ_MLE): {mle_mu:.3f}")
print(f"MAP 추정 (μ_MAP): {map_mu:.3f}")

# 시각화: 가능도 함수
x_vals = np.linspace(0, 10, 100)
likelihood = norm.pdf(x_vals, mle_mu, true_sigma / np.sqrt(n_samples))  # MLE 가능도
prior = norm.pdf(x_vals, prior_mu, prior_sigma)  # 사전 확률
posterior = norm.pdf(x_vals, map_mu, true_sigma / np.sqrt(n_samples))  # MAP 사후 확률

plt.figure(figsize=(8, 5))
plt.plot(x_vals, likelihood, label="Likelihood (MLE)", linestyle="dashed")
plt.plot(x_vals, prior, label="Prior (MAP)", linestyle="dotted")
plt.plot(x_vals, posterior, label="Posterior (MAP)", linestyle="solid")
plt.axvline(mle_mu, color="red", linestyle="dashed", label="MLE Estimate")
plt.axvline(map_mu, color="blue", linestyle="solid", label="MAP Estimate")
plt.axvline(true_mu, color="black", linestyle="dashdot", label="True μ")
plt.legend()
plt.xlabel("μ")
plt.ylabel("Probability Density")
plt.title("MLE vs MAP Estimation")
plt.show()

 

 

실행 결과:

MLE, MAP 코드 예제 결과

코드 설명

  1. 데이터 생성: 평균 μ=5, 표준편차 σ=2 인 정규 분포에서 30개의 샘플을 생성.
  2. MLE 추정: 단순히 샘플의 평균을 사용하여 μ 를 추정.
  3. MAP 추정: 사전 확률(정규 분포) 정보를 고려하여 μ 를 추정.
  4. 가능도/사전 확률/사후 확률 시각화:
    • 빨간색 점선 → MLE 추정값
    • 파란색 실선 → MAP 추정값
    • 검은색 점선 → 실제 모수 값 (Ground Truth)
    • 그래프에서 MLE는 데이터에만 의존하고, MAP는 사전 정보를 반영하여 조금 더 보수적인 추정을 함.