
이론
사전확률을 이용해서 사후확률을 구하는 과정을 베이즈 갱신이라고 한다.
\(P(H|D) = \frac{P(D|H)P(H)}{P(D)}\)
- \(P(H)\): 가설의 확률. 사전확률
- \(P(H|D)\): 데이터가 주어졌을 때 가설의 확률. 사후확률
- \(P(D|H)\): 가설하에서 데이터가 나올 확률. 가능도(우도)
- \(P(D)\): 데이터의 확률. \(P(D) = \sum P(H_i)P(D|H_i)\)
가설은 상호 배제와 전체 포괄 가정이 필요하다.
즉, 가설은 서로 배타적이어야 하고, 모든 가능한 가설을 포함해야 한다.
베이즈 테이블
- 가설과 데이터를 정리한다.
- 사전확률을 구한다.
- 각 가설 하에서의 데이터 가능도를 구한다.
- 베이즈 테이블을 정리한다.
쿠키 문제
- 그릇 1에서 바닐라 쿠키를 집을 확률은 3/4
- 그릇 2에서 바닐라 쿠키를 집을 확률은 1/2
- 바닐라 쿠키를 집었을 때, 그릇 i에서 집었을 확률은?
import pandas as pd
table = pd.DataFrame(index=['bowl1', 'bowl2'])
table['prior'] = 1/2, 1/2
table['likelihood'] = 3/4, 1/2
table['unnorm'] = table['prior'] * table['likelihood']
table['posterior'] = table['unnorm'] / table['unnorm'].sum()
table
bowl1 |
0.5 |
0.75 |
0.375 |
0.6 |
bowl2 |
0.5 |
0.50 |
0.250 |
0.4 |
주사위 문제
- 육면체, 팔면체, 십이면체 주사위가 든 상자가 있다.
- 이 중 임의로 하나를 집어 굴렸더니 1이 나왔다.
- 이 주사위가 육면체일 확률은?
def update(table):
table['unnorm'] = table['prior'] * table['likelihood']
prob_data = table['unnorm'].sum()
table['posterior'] = table['unnorm'] / prob_data
return prob_data
from fractions import Fraction
table2 = pd.DataFrame(index=[6, 8, 12])
table2['prior'] = Fraction(1, 3)
table2['likelihood'] = Fraction(1, 6), Fraction(1, 8), Fraction(1, 12)
prob_data = update(table2)
table2
6 |
1/3 |
1/6 |
1/18 |
4/9 |
8 |
1/3 |
1/8 |
1/24 |
1/3 |
12 |
1/3 |
1/12 |
1/36 |
2/9 |
몬티홀 문제
- 1,2,3 번호가 붙은 세 개의 문 중 하나에 상품이 있다.
- 참가자는 문 하나를 선택하고, 사회자는 나머지 두 문 중 상품이 없는 문을 열어 보여준다.
- 참가자는 처음 선택한 문을 유지하거나 다른 문으로 바꿀 수 있다.
- 당신은 1번 문을 선택했고, 사회자는 문 3을 열었다.
- 다시 참가자가 문을 선택했을 때 상품이 있는 문을 선택할 확률은?
table3 = pd.DataFrame(index=[1, 2, 3])
table3['prior'] = Fraction(1, 3)
table3['likelihood'] = Fraction(1, 2), 1, 0
prob_data = update(table3)
table3
1 |
1/3 |
1/2 |
1/6 |
1/3 |
2 |
1/3 |
1 |
1/3 |
2/3 |
3 |
1/3 |
0 |
0 |
0 |
연습문제
2-1
table = pd.DataFrame(index=['normal', 'weird'])
table['prior'] = Fraction(1, 2)
table['likelihood'] = Fraction(1, 2), 1
prob_data = update(table)
table
normal |
1/2 |
1/2 |
1/4 |
1/3 |
weird |
1/2 |
1 |
1/2 |
2/3 |
2-2
table = pd.DataFrame(index=['bb', 'bg', 'gb', 'gg'])
table['prior'] = Fraction(1, 4)
table['likelihood'] = 0, 1, 1, 1
prob_data = update(table)
table
bb |
1/4 |
0 |
0 |
0 |
bg |
1/4 |
1 |
1/4 |
1/3 |
gb |
1/4 |
1 |
1/4 |
1/3 |
gg |
1/4 |
1 |
1/4 |
1/3 |
2-3
table = pd.DataFrame(index=[1, 2, 3])
table['prior'] = Fraction(1, 3)
table['likelihood'] = 1, 0, 1
prob_data = update(table)
table
1 |
1/3 |
1 |
1/3 |
1/2 |
2 |
1/3 |
0 |
0 |
0 |
3 |
1/3 |
1 |
1/3 |
1/2 |
table = pd.DataFrame(index=[1, 2, 3])
table['prior'] = Fraction(1, 3)
table['likelihood'] = 0, 1, 0
prob_data = update(table)
table
1 |
1/3 |
0 |
0 |
0 |
2 |
1/3 |
1 |
1/3 |
1 |
3 |
1/3 |
0 |
0 |
0 |
2-4
table = pd.DataFrame(index=['1994_1996', '1996_1994'])
table['prior'] = Fraction(1, 2)
table['likelihood'] = Fraction(2, 10) * Fraction(2, 10), Fraction(14, 100) * Fraction(1, 10)
prob_data = update(table)
table
1994_1996 |
1/2 |
1/25 |
1/50 |
20/27 |
1996_1994 |
1/2 |
7/500 |
7/1000 |
7/27 |
맨 위로