개요

  • 4면체, 6면체, 8면체, 12면체, 20면체 주사위가 든 상자가 있다.
  • 상자에서 임의로 주사위 하나를 집어서 던졌더니 6이 나왔다.

각 주사위를 선택했을 확률은?

풀이

손으로 계산해 풀기

  • 5 개의 가설(Hypothesis)을 생각할 수 있다.
    • 4면체 주사위를 던졌다.
    • 6면체 주사위를 던졌다.
    • 8면체 주사위를 던졌다.
    • 12면체 주사위를 던졌다.
    • 20면체 주사위를 던졌다.
  • 데이터 D : 주사위를 던져 6이 나왔다.

이해하기 쉽게 표로 정리해 보자.

설명
4면체 주사위를 선택할 확률
6면체 주사위를 선택할 확률
8면체 주사위를 선택할 확률
12면체 주사위를 선택할 확률
20면체 주사위를 선택할 확률
4면체 주사위를 던져 6이 나올 확률 0
6면체 주사위를 던져 6이 나올 확률
8면체 주사위를 던져 6이 나올 확률
12면체 주사위를 던져 6이 나올 확률
20면체 주사위를 던져 6이 나올 확률
주사위를 던져 6이 나올 확률 아직 모름

부터 구해보자.

이는 다음과 같다.

이제 주사위 하나씩 살펴보면서 를 구하면 된다.

[[Bayes-theorem]]에 의해 다음과 같이 식을 꾸밀 수 있다.

4면체 주사위를 던져 6이 나오는 것은 불가능하므로 패스.

6면체 주사위의 경우는

8면체 주사위의 경우는

12면체 주사위의 경우는

20면체 주사위의 경우는

따라서 결과는 다음과 같다.

각 주사위를 선택했을 확률은?

주사위 확률
4면체 0
6면체 약 0.392156862745098
8면체 약 0.294117647058824
12면체 약 0.196078431372549
20면체 약 0.117647058823529

직접 코딩해 풀기

다음은 [[Think-Bayes]]의 코드를 참고하여 자바스크립트로 풀어본 것이다.

// hypos: 가설의 배열
// 가설의 배열을 돌며 같은 경우의 수 1을 부여한다
function init(hypos) {
    const dict = {};
    hypos.forEach((h) => {
        dict[h] = 1;
    });
    return dict;
}

// 모든 가설을 돌며 mix의 data에 해당하는 값을 곱해 업데이트한다
function update(dict, data) {

    Object.keys(dict).forEach((hypo) => {
        dict[hypo] = dict[hypo] * likelihood(hypo, data);
    });

    return normalize(dict);
}

// p(D | H_n)
function likelihood(hypo, data) {
    if (hypo < data) {
        return 0;
    }
    return 1 / hypo;
}

// 모든 가설의 확률의 비율을 유지하며, 총합이 1이 되도록 정규화한다
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;
}

function main() {

    const hypos = [4, 6, 8, 12, 20];
    const pmf = init(hypos);
    const result = update(pmf, 6);
    console.log(result);
}

main();

위의 코드를 실행하면 다음의 결과가 출력된다.

$ node dice.js
{ '4': 0,
  '6': 0.3921568627450981,
  '8': 0.2941176470588236,
  '12': 0.19607843137254904,
  '20': 0.11764705882352944 }

코드를 잘 읽어보면 p(D)는 일일이 구할 필요가 없으며, p(Hn) 도 비율만 맞춰주면 된다는 것을 알 수 있다.

Links

  • [[Think-Bayes]]