개요

  • 쿠키 두 그릇이 있다.
  • 첫 번째 그릇: 40 개의 쿠키가 담겨 있다.
    • 바닐라 쿠키 30개
    • 초콜렛 쿠키 10개
  • 두 번째 그릇: 40개의 쿠키가 담겨 있다.
    • 바닐라 쿠키 20개
    • 초콜렛 쿠키 20개

문제 : 어떤 그릇인지 보지 않고 한 그릇에서 임의로 쿠키를 집었는데 바닐라 쿠키였다. 그렇다면 이 때 이 바닐라 쿠키가 그릇1에서 나왔을 가능성은?

풀이

손으로 풀기

바닐라 쿠키가 나온 상태에서 그릇 1의 가능성을 따지는 것이므로 다음의 식을 풀면 된다.

\[p( 그릇1 \mid 바닐라)\]

[[Bayes-theorem]]이 다음과 같으므로,

\[p(A \mid B) = {p(A) \space p(B \mid A) \over p(B)}\]

식도 다음과 같이 꾸며보자.

\[p(B_1 \mid V) = {p(B_1) \space p(V \mid B_1) \over p(V)}\]

생각해야 할 변수가 많으므로 표로 정리해야 이해하기 쉽다.

설명
\(p(B_1)\) 그릇1을 선택할 확률 \(1 \over 2\)
\(p(V)\) 바닐라 쿠키를 선택할 확률 모름
\(p(V \mid B_1)\) 그릇1에서 바닐라 쿠키를 선택할 확률 \({30 \over 40} = {3 \over 4}\)
\(p(V \mid B_2)\) 그릇2에서 바닐라 쿠키를 선택할 확률 \({20 \over 40} = {1 \over 2}\)
\(p(B_1 \mid V)\) 바닐라 쿠키를 선택했는데 그릇1에서 나왔을 확률 이 값이 답이다

바닐라 쿠키를 선택할 확률 \(p(V)\)를 먼저 구해보자.

다음의 두 값을 구해 더하면 된다.

  • 그릇1에서 바닐라 쿠키를 선택할 확률.
  • 그릇2에서 바닐라 쿠키를 선택할 확률.

식은 다음과 같이 두 가지 형태로 만들 수 있는데

\[\begin{align} p(V) & = p(V \space and \space B_1) + p(V \space and \space B_2) \\ & = p(V) p(B_1 \mid V) + p(V) p(B_2 \mid V) \\ \end{align}\] \[\begin{align} p(V) & = p(B_1 \space and \space V) + p(B_2 \space and \space V) \\ & = p(B_1) p(V \mid B_1) + p(B_2) p(V \mid B_2) \\ \end{align}\]

첫번째의 경우 양 변을 p(V)로 나눠주면 \(1 = p(B_1 \mid V) + p(B_2 \mid V)\) 이 나오므로 의미가 없다.

따라서 두 번째 식을 사용해 계산한다.

\[\begin{align} p(V) & = p(B_1 \space and \space V) + p(B_2 \space and \space V) \\ & = p(B_1) p(V \mid B_1) + p(B_2) p(V \mid B_2) \\ & = {1 \over 2} \times {30 \over 40} + {1 \over 2} \times {20 \over 40} \\ & = {3 \over 8} + {2 \over 8} \\ & = {5 \over 8} \\ \end{align}\]

이제 \(p(V)\)를 구했으니 식에 대입해 보자.

\[\begin{align} p(B_1 \mid V) & = \frac{ {1 \over 2} \times {3 \over 4} }{5 \over 8} = \frac{3 \over 8}{5 \over 8} = \frac{3}{5} \\ \end{align}\]

따라서, 답은 \(3 \over 5\) 이다.

Think-Bayes 책에서 제공하는 라이브러리를 사용해 풀기

"""This file contains code for use with "Think Bayes",
by Allen B. Downey, available from greenteapress.com

Copyright 2012 Allen B. Downey
License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html
"""

from thinkbayes import Pmf

pmf = Pmf()
pmf.Set('Bowl 1', 0.5)  # p(B1)
pmf.Set('Bowl 2', 0.5)  # p(B2)

pmf.Mult('Bowl 1', 0.75)    # p(B1) * p(V | B1)
pmf.Mult('Bowl 2', 0.5)     # p(B2) * p(V | B2)

pmf.Normalize()

print pmf.Prob('Bowl 1')

위의 파이썬 코드를 실행하면 0.6이 나온다.

$ python cookie.py
0.6

직접 코딩해 풀기

[[/study/think-bayes]] 저자가 제공하는 라이브러리를 사용하는 것은 편리한 일이지만, 파이썬2에서만 돌아가고 상속구조가 있어 한 눈에 보기 불편하다는 단점이 있다.

그래서 책의 소스코드를 보고 다음과 같이 자바스크립트로 문제를 풀어 보았다.

// 사전 분포
const pmf = {
    'Bowl1': (1/2), // p(B_1)
    'Bowl2': (1/2), // p(B_2)
};

// 우도
const pvb1 = (3/4);
const pvb2 = (1/2);


// p(B_1) * p(V|B_1)
// p(B_2) * p(V|B_2)
pmf['Bowl1'] = pmf['Bowl1'] * pvb1;
pmf['Bowl2'] = pmf['Bowl2'] * pvb2;

// 정규화
function normalize(dict) {
    const values = Object.values(dict);
    const sum = values.reduce((a, b) => a + b);
    const result = {};
    Object.keys(dict).forEach((key) => {
        result[key] = dict[key] / sum;
    });
    return result;
}

console.log(normalize(pmf));

// 결과는 { Bowl1: 0.6, Bowl2: 0.4 }

normalize를 사용하는 방식이 인상적이다.

  • 그 결과로, B_1B_2를 한 번에 구할 수 있다.
  • 한편, normalizep(V)를 계산해 적용하는 작업이므로 수작업으로 p(V)를 계산하지 않아도 된다는 장점이 있다.

공산을 사용해 풀기

  • [[Bayes-theorem]] 문서의 공산을 참고할 것.

공산을 사용하면 매우 간단하게 풀 수 있다.

베이즈 정리의 공산 형태는 다음과 같다.

\[\begin{align} o(A \mid D) & = o(A) \times \frac{p(D \mid A)}{p(D \mid B)} \\ \text{사후 공산} & = \text{사전 공산} \times \text{우도비} \\ \end{align}\]

위에서 문제를 풀 때 사용한 변수명을 적용해 보자.

\[o(B_1 \mid D) = o(B_1) \times \frac{p(D \mid B_1)}{p(D \mid B_2)}\]

변수를 표로 정리해 보자.

설명
\(o(B_1 \mid D)\) 바닐라 쿠키가 그릇1 에서 나왔을 사후 공산 모름
\(o(B_1)\) 그릇1을 선택 : 그릇2를 선택 \(1 : 1 = \frac{1}{1}\)
\(p(D \mid B_1)\) 그릇1에서 바닐라 쿠키를 선택할 확률 \({30 \over 40} = {3 \over 4}\)
\(p(D \mid B_2)\) 그릇2에서 바닐라 쿠키를 선택할 확률 \({20 \over 40} = {1 \over 2}\)
\[\begin{align} o(B_1 \mid D) & = o(B_1) \times \frac{p(D \mid B_1)}{p(D \mid B_2)} \\ & = 1 \times {\frac{3}{4} \over \frac{1}{2}} \\ & = \frac{6}{4} \\ \end{align}\]

사후 공산이 \(\frac{6}{4}\)이므로, 다음을 알 수 있다.

\[\text{그릇 1에서 바닐라 쿠키가 나왔을 확률} : \text{그릇 2에서 바닐라 쿠키가 나왔을 확률} \\ = 6 : 4\]

따라서 그릇1에서 바닐라 쿠키가 나왔을 확률은 \(\frac{6}{6 + 4} = 0.6\) 이다.