프로그래머를 위한 베이지안

확률을 다시한번 믿음의 관점에서 생각해보자. 어떤 사건 A는 단 한번만 일어나거나 도저히 구할 수 없는 사건이라면 믿음 *P(A)*를 구한다.

이때, 0이라는 믿음을 부여하는 사람은 그 사건이 일어나지 않을 것이라 확인하는 사람이며

반대로, 1로 부여한다면 반드시 일어난다고 생각하는 사람일 것이다.

만약, 믿음을 색으로 표현할 수 있다면 아래 그림처럼 1로 갈수록 선명한 모습일 것이다.

위 수식은 베이즈 공식으로 사전확률 *P(A)*를 증거 X에 의해 업데이트 된 사후확률을 구할 때, 쓰인다.

아직 수식의 의미를 깊게 파악할 필요는 없다. 그냥 그렇게 생각하고 넘어가면 된다.

1.2.1 동전 던지기

주머니에 있는 동전은 과연 공정한 동전일까? 어디가 찌그러져 있거나 하지는 않을까?

이런 궁금증을 가지고 동전 던지기 실험을 해보자. 앞면이 나올 확률을 p라고 둔 뒤, 데이터가 증가할 수록 어떻게 변하는지 살펴보자.

from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc('font', family='Malgun Gothic')
import scipy.stats as stats

figsize(11, 9)

dist = stats.beta
n_trials = [0, 1, 2, 3, 4, 5, 8, 15, 50, 500]
data = stats.bernoulli.rvs(0.5, size=n_trials[-1])
x = np.linspace(0, 1, 100)

# For the already prepared, I'm using Binomial's conj. prior.
for k, N in enumerate(n_trials):
    sx = plt.subplot(len(n_trials) / 2, 2, k + 1)
		if k in [0, len(n_trials) - 1] :
		        plt.xlabel("$p$, 앞면의 확률", fontsize=13)
    plt.setp(sx.get_yticklabels(), visible=False)
    heads = data[:N].sum()
    y = dist.pdf(x, 1 + heads, 1 + N - heads)
    plt.plot(x, y, label="%d 번의 동전 던지기,\\n앞면 %d 번 관측" % (N, heads))
    plt.fill_between(x, 0, y, color="#348ABD", alpha=0.4)
    plt.vlines(0.5, 0, 4, color="k", linestyles="--", lw=1)

    leg = plt.legend()
    leg.get_frame().set_alpha(0.4)
    plt.autoscale(tight=True)

plt.tight_layout()

결과를 보니 동전을 많이 던질수록 p=0.5 에 가까워 가는 모습을 볼 수 있다. 데이터가 증가할 수록 분포의 모습이 뾰족해지지만 결코 상수가 되지는 않는다. 항상 분포의 모습을 유지한다.