수학/베이지안 추론

베이즈 추론 명확하게 이해하기: 강아지 몸무게 추정 (1/3)

FedTensor 2025. 12. 9. 11:32

아래 글을 읽고 베이즈 추론의 핵심 개념을 명확하게 이해하기 위하여 이 문서를 작성합니다. 인용한 글은 인용 구역으로 표시하였습니다.

측정 몸무게, 실제 몸무게, 추정 몸무게

 On our last visit, we got three measurements before she became unmanageable: 13.9 lb, 17.5 lb and 14.1 lb. There is a standard statistical interpretation for this. We can calculate the mean, standard deviation and standard error for this set of numbers and create a distribution for Reign’s actual weight.

 

강아지의 실제 몸무게는 하나의 값을 가지겠지만 그 값의 크기가 얼마인지는 정확하게 알 수 없습니다. 다만 저울과 같은 도구를 사용하여 얻는 측정 몸무게 값들로부터 강아지의 실제 몸무게를 추정할 수 있을 뿐입니다.

  • 추정: 수학 통계에서, 어떤 모집단(母集團)으로부터 뽑아낸 표본을 바탕으로 하여 그 모집단의 평균ㆍ분산 따위를 헤아리는 일. - 출처: 네이버 사전

실제 몸무게를 좀 더 정확하게 추정하기 위하여 다음과 같은 방법들을 사용하기도 합니다.

  1. 여러 번 측정하고 측정값들의 평균을 구한다.
  2. 여러 번 측정하고 대다수의 값과 너무 크게 차이나는 일부 값들을 버린 후 나머지 측정값들로 평균을 구한다.
  3. 여러 번 측정하고 기존에 알고 있던 측정값과 가까운 측정값들에게는 높은 가중치를 부여하고 멀리 떨어져 있는 측정값들에게는 낮은 가중치를 부여하여 측정값들의 평균을 구한다.

측정 몸무게의 분포에 대한 전제

이제 이 글을 전개함에 있어서 바탕이 되는 하나의 전제를 아래와 같이 설정합니다.
  • 강아지의 실제 몸무게가 w_actual일 때 측정 몸무게 값들의 확률분포는 정규분포를 따른다. 정규분포의 평균은 w_actual이고 표준편차는 저울의 성능과 강아지가 측정하는 동안 얼마나 조용히 있느냐에 따라 달라질 수 있다. 이 글에서는 논의를 단순화하기 위하여 표준편차를 항상 1.0으로 고정시킨다.
관찰이 가능한 결과가 생성되는 과정을 구체적으로 정의한 것을 모델이라고 부르며 모델의 모습을 결정하는데 필요한 항목들을 파라미터라고 합니다. 위의 전제를 모델과 파라미터라는 용어를 사용하여 다시 표현하면 아래와 같습니다.
  • 모델: 강아지의 실제 몸무게가 w_actual일 때 측정 몸무게 값들의 확률분포는 정규분포를 따른다.
  • 파라미터: 정규분포의 파라미터는 평균과 표준편차이다. 평균은 w_actual이고 표준편차는 저울의 성능과 강아지가 측정하는 동안 얼마나 조용히 있느냐에 따라 달라질 수 있다. 이 글에서는 논의를 단순화하기 위하여 표준편차를 항상 1.0으로 고정시킨다.

측정 몸무게로부터 실제 몸무게 추정

그렇다면 강아지의 실제 몸무게가 어떤 값일 때 세 번 측정하여 다음과 같은 측정 몸무게 값들을 얻을 가능성이 가장 높을까요?
  • 측정 몸무게: 13.9 lb, 17.5 lb and 14.1 lb
실제 몸무게를 다음 세 가지로 설정하고 각각에 대하여 측정 몸무게의 확률분포 그래프를 그려봄으로써 가능성의 차이를 시각적으로 비교해 볼 수 있습니다.
  • 13.0 lb
  • 14.5 lb
  • 16.0 lb
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

%matplotlib inline

w_measured_arr = sorted([13.9, 17.5, 14.1])

def plot_measured_weight_probability_density(w_actual, s_actual, w_measured_arr):
    x = np.arange(10, 20, 0.1)
    y = stats.norm.pdf(x, w_actual, s_actual)
    
    p_measured = stats.norm.pdf(w_measured_arr, w_actual, s_actual)

    plt.plot(x, y)
    plt.plot(w_measured_arr, p_measured, 'o')
    plt.vlines(w_measured_arr, 0, 0.40, colors='r')
    plt.grid(True)
    plt.title(f'actual weight: {w_actual:.1f} lb')
    plt.xlabel('measured weight')
    plt.ylabel('probability density')

plt.figure(figsize = (15, 4))

# subplot-1
w_actual = 13.0
s_actual = 1.0

plt.subplot(131)
plot_measured_weight_probability_density(w_actual, s_actual, w_measured_arr)

# subplot-2
w_actual = 14.5

plt.subplot(132)
plot_measured_weight_probability_density(w_actual, s_actual, w_measured_arr)

# subplot-3
w_actual = 16.0

plt.subplot(133)
plot_measured_weight_probability_density(w_actual, s_actual, w_measured_arr)
    
plt.show()

 

위의 세 그래프 중에서 실제 몸무게가 14.5 lb인 경우 세 개의 측정 몸무게 값을 얻을 가능성이 가장 높아 보입니다. 실제 몸무게가 주어질 때 얻게 되는 측정 몸무게의 분포 곡선이 확률밀도함수라는 점을 이용하여 실제 몸무게일 가능성을 수치로 나타내고 비교할 수 있습니다. 세 측정값에 해당하는 확률밀도를 모두 곱하여 얻는 값을 우도(likelihood)라고 부르고 이 값의 크기를 서로 비교합니다.

def get_likelihood(w_actual, s_actual, w_measured_arr):
    p_measured = stats.norm.pdf(w_measured_arr, w_actual, s_actual)
    likelihood = np.prod(p_measured)
    return likelihood

w_actual_arr = [13.0, 14.5, 16.0]
likelihood_arr = []

for w_actual in w_actual_arr:
    likelihood = get_likelihood(w_actual, s_actual, w_measured_arr)
    likelihood_arr.append(likelihood)
    print(f'actual weight = {w_actual:.1f}, likelihood = {likelihood:.3e}')
    
plt.plot(w_actual_arr, likelihood_arr, 'o')
plt.xlim(10, 20)
plt.ylim(0, 0.8e-3)
plt.grid(True)
plt.title('Likelihood distribution')
plt.xlabel('actual weight')
plt.ylabel('likelihood')
plt.show()
actual weight = 13.0, likelihood = 9.265e-07
actual weight = 14.5, likelihood = 5.439e-04
actual weight = 16.0, likelihood = 3.738e-04