Think Bayes (2) 계산 통계
파이썬을 활용한 베이지안 통계, 앨런 B. 다우니 지음, 권정민 옮김/한빛미디어 |
2.1 분포
통계에서 분포는 어떤 값과 그 값이 나타날 확률의 집합이다. 예를 들어, 주사위를 굴렸을 때 가능한 숫자의 집한은 1부터 6까지이고, 각 값에 대한 확률은 1/6이다.
파이썬으로 분포를 나타내고자 한다면 각 값과 확률을 연결하는 딕셔너리를 사용하면 된다. 이를 위해 책에서는 Pmf라는 클래스를 만들었다. 이는 확률 질량 함수 (Probability Mass Function) 에서 이름을 가져왔다. Pmf는 http://thinkbayes.com/thinkbayes.py 에서 받으면 된다.
사용하려면 다음처럼 Pmf
를 임포트하여 사용하면 된다.
1 2 |
from thinkbayes import Pmf |
주사위의 결과 분포를 나타내어보자.
빈 Pmf
객체를 생성하고 Set
명령을 통해 각 값에 1/6의 확률을 설정한다.
1 2 3 4 |
pmf = Pmf() for x in [1,2,3,4,5,6]: pmf.Set(x, 1/6) |
다음은 각 단어가 등장한 횟수를 세는 코드이다.
Incr은 단어마다 확률을 1 높이며, 단어가 없으면 이를 추가한다.
1 2 3 4 |
pmf = Pmf() for word in word_list: pmf.Incr(word, 1) |
실은 위의 코드에서 확률은 정규화되지 않았다. 즉 확률의 합이 1이 되지 않았으므로 확률이라고 할 수가 없다. 따라서 단어의 전체 수로 나누어 주어야 확률을 계산할 수 있다. Pmf
는 이를 위해 Normalize
메서드를 제공한다.
1 2 |
pmf.Normalize() |
Pmf 객체를 한 번 만들면, 어느 값에 대한 확률을 물어볼 수 있다.
1 2 |
pinrt pmf.Prob('the') |
2.2 쿠키 문제
베이즈 이론의 쿠키 문제를 Pmf
를 이용하여 연결하여보자. 쿠키 문제의 가설은 B1과 B2이다.
1 2 3 4 5 |
pmf = Pmf() pmf.Set('Bowl 1', 0.5) pmf.Set('Bowl 2', 0.5) |
이것은 각 가설에 대한 사전 확률을 나타내는 사전 분포이다.
새로운 데이터(바닐라 쿠키)에 근거하여 이 분포를 갱신하려면 각 사전 확률과 이에 해당하는 우도를 곱한다. 그릇 1에서 바닐리 쿠키를 집는 것에 대한 우도는 3/4이고, 그릇 2에서의 우도는 1/2이다.
1 2 3 |
pmf.Mult('Bowl 1', 0.75) pmf.Mult('Bowl 2', 0.5) |
아직 확률이 정규화되지 않았으니 다시 한 번 정규화를 해 준다.
1 2 |
pmf.Normalize() |
결과는 사후 확률을 나타내는 사후 분포이다.
마지막으로 그릇 1의 사후 확률을 출력하여 보자.
1 2 |
print pmf.Prob('Bowl 1') |
정답은 0.6이다.
http://thinkbayes.com/cookie.py
2.3 베이지안 프레임워크
다음 문제로 넘어가기 전에 코드를 일반화 해보자. 캡슐화 하여 클래스로 만들어보고자 한다. 아래 소스를 참고하자.
http://thinkbayes.com/cookie2.py
2.4 몬티 홀 문제
몬티 홀 또한 새로운 클래스로 작성해 보았다.
http://thinkbayes.com/monty.py
2.5 프레임워크 캡슐화
이를 다시 캡슐화 하여 보자.
http://thinkbayes.com/monty2.py
실은 책에서 제공하는 Suite
이라는 클래스가 있다. 이를 사용하려면 이를 상속 받고, Likelihood
메서드를 추가하여 작성하면 된다.
2.6 M&M 문제
M&M 문제 역시 마찬가지로 Suite
를 사용할 수 있다.
http://thinkbayes.com/m_and_m.py
2.7 토의
이 장에서 살펴보면 Suite
은 실제로 완전히 구현되지 않은 인터페이스를 가지는 추상적 타입이다. 따라서 Likelihood
의 내용은 없으므로 구현을 해야한다.
다음 장의 예제들도 동일한 패턴을 따를 것이다. 각각의 문제에서 Suite
를 확장하고, Update
를 상속 받고, Likelihood
를 작성하는 새로운 클래스를 정의할 것이다. 때로는 성능 향상을 위해 Update
를 오버라이드하기도 할 것이다.