매번 시험할 때마다 동전표 안의 사후 분포를 보아야 한다(PyMC)

개시하다


'파이썬 체험 베이즈 추론 파이MC MC 입문'이 도착했습니다. 기쁘면서도 손을 움직이면서 전진할 수 있습니다. 이해할 수 있지만 한 가지는 제 기본적인 이해를 확인하기 위해 저도 글을 정리해 봤습니다.
저도 첫 학자인데 앞으로 베이즈 스트리밍을 경험하고 싶은 분들의 응원이 됐으면 좋겠습니다.
동전의 확률 분포를 먼저 확인한 뒤 PyMC가 산출한 후 분포를 확인한 뒤 베이즈 통계의'주관'을 어떻게 넣을지 시도한다.

동전 투입의 분포


우선 N회 동전을 던지는 정면 횟수가 H(Head)면 뒷면 횟수가 N-H다.
읽었다위키백과의 두 가지 분포. 이번 동전 투입의 과제는 이 두 가지 분포(Binomial Distribution)를 따르는 것이라고 할 수 있다.
또한 이 두 가지 분포에는 분포 형태를 결정하는 매개 변수 p와 N이 있다.
p는 계산이 필요한 매개 변수로 N은 동전의 시험 횟수를 직접 사용할 수 있다.
실제 동전이라면 뒷면과 앞면이 나올 확률이 같다는 것을 알기 때문에 p=0.5가 특별한 경우라는 것을 알지만, 이를 모르기 때문에 지금은 p를 추정하는 값(p=0.5일 때 앞면과 뒷면이 나올 확률이 딱 절반이라고 생각해주세요.
...근데 진짜 p=0.5 이런 인식이면 되는 거예요?
우리가 바로 머릿속에서 하는 일은 정면과 뒷면이 절반의 확률이어야 하기 때문에 p=0.5가 틀림없다!그러나 이런 생각은 불확실성을 버렸다.
예를 들어 다음 도표를 확인하면 두 개 모두 p=0.5의 최대치이지만 p=0.5의 확신도가 다르다고 해석할 수 있습니까?


위의 그림은 아래의 그림에 비해 파란색 구역이 좌우로 뻗어 있다.
이것은 위 그림의 p=0.5의 확신도가 아래 그림의 p=0.5의 확신도보다 낮다는 것을 나타낸다.
다시 말하면 다음 그림은 더 자신감이 넘친다. p=0.5 정도!이렇게 주장했다고 할 수 있다.
이처럼 베이즈의 방법은 특정한 값으로 처리하는 것이 아니라 불확실성을 표현할 수 있는 더 부드러운 형태(확률 분포)로 처리한다.
p=0.5 이런 정보뿐만 아니라 p=0.1은 이렇다. p=2는 이런 p=3...이런 식이죠?

MCMC


본 보도는 MCMC로 불리는 수법을 사용한다.
MCMC와 관련해서는 검색엔진에서 훌륭한 정보원을 많이 찾을 수 있으니 별도로 참고하시기 바랍니다.
당분간 확률 분포를 찾는 방법 중 하나로 삼으면 된다.
엄밀한 백업 분포 형태를 추구하지 않고 비슷한 결과를 출력할 수 있는 기법이 특징이다.
복잡한 사후분포라면 원래는 촘촘하게 분포된 모양을 추구할 수 없었지만, MC를 사용해 현실적인 계산 시간으로 분포를 구할 수 있었다.
실제로 이번 콘텐츠에 요구되는 분포 형태가 간단하다는 것을 알기에 MCMC를 쓸 필요는 없지만, 실제 응용할 때는 분포 형태 자체를 모르는 경우가 많기 때문에 그 정수를 체험할 때도 MCMC를 활용해 진행하는 것을 고려한다.

주관을 잃은 상태에서 사후 분포를 보다


이번에는 사후 분포를 찾기 위해pymc라는 MCC의 실장 중 하나를 사용했다.

import pymc as pm
from pymc.Matplot import plot as mcplot
일단 어떤 데이터도 관측되지 않은 상태를 확인한다.
게다가 나는 이 동전이 정면이나 뒷면에서 쉽게 나올 것이라고 생각하지 않는다.
observed = []
h = observed.count(1)
n = len(observed)

# 二項分布のパラメータpの事前分布(一様分布を設定)
alpha, beta = 1, 1
p = pm.Beta('p', alpha=alpha, beta=beta)

# コイン投げの試行は二項分布に従うのでBinomial
obs = pm.Binomial('y', n=n, p=p, value=h, observed=True)

# モデルを定義してサンプリングすることで事後分布を求める
model = pm.Model([obs, p])
mcmc = pm.MCMC(model)
mcmc.sample(60000, 10000)
mcplot(mcmc.trace('p'))
observed = []는 실제 동전을 던져 관측한 정면과 뒷면의 목록이다.
앞으로 이것observed을 변경해 분포의 형상이 어떻게 변할지 확인한다.pm.Beta('p', alpha=alpha, beta=beta)에는 "이 동전이 앞면인지 뒷면인지 쉽게 나온다고 생각하지 않는다"는 메시지가 반영됐다.
책 등에서는 "가정을 설정하지 않기 위해 균등분포를 사전분포로 설정한 경우"등이 많았다.
그 다음에 모델을 정의하여 샘플링을 하고 분포된 모양을 구한다.sample(60000, 10000) 샘플 6만개를 수집해 최초 1만개를 폐기하도록 지정했다.
관심 있으신 분들은 MC 자체를 조사해 주세요.
마지막으로 우리가 흥미를 느끼는 두 가지 분포된 매개 변수 p의 샘플을 합쳐서 분포 출력으로 한다.
위에서 몇 초 동안 기다린 후 다음 그래프를 출력합니다.

오른쪽 그림은 뒤에 분포된 모양을 나타낸다.
이상적인 형상은 위키백과: 연속 균일 분포의 그림에서 보여준 형상이지만 MCMCMC는 비슷한 출력으로 다소 편차가 있다.
위의 예라면 어떤 데이터도 관측되지 않았기 때문에 아무런 가설도 없는 정보가 바로 나왔다.
그리고 동전을 한 번 던져 뒷면(=0)이 나타날 때의 모양을 확인한다.observed = [0]로 상기 코드를 다시 실행한 후 아래 그림을 출력합니다.

형상에 큰 변화가 생겼다.
이 결과, 이 동전은 뒷면이 잘 드러난다!이런 표현 방식.
이어서 안에 나타난 상황observed = [0, 0]을 다시 한 번 확인해 봅시다.

분포형태observed = [0]와 비교하면 0.1 증가했고, 그 외 형태는 완만하게 작아졌다.
아무래도 뒷면이 두 번 연속으로 나오기 때문에 observed = [0]보다 자신감이 있고 뒷면이 더 잘 나와요!이런 신념을 반영했다고 할 수 있다.
다음은 표에 나온 상황observed = [0, 0, 1].

예전과 다른 산과 같은 것이 확인되고, 그 산꼭대기가 약간 오른쪽에 있는 것도 확인된다.
이전과 달리 시계를 관측할 수 있기 때문에 p의 값도 비교적 쉽게 시계를 표시할 수 있도록 업데이트되었다.
동전 좀 더 넣어봐.
동전 50번 투입 확인표는 24번 투입 후 분포.

산꼭대기는 p=0.5에 가깝고 우리가 p=0.5라고 생각하는 예상과 비슷하다.
그러나 베이스에서 p=0.5가 아니라 확률 분포로 정보를 유지하는 것을 잊지 마세요.

멋진 남자일지도 모른다는 생각으로 사후 분포를 보다


간단한 게임은 동전을 던지면 상대방이 이기고 반대로 나오면 자신이 이기는 것이다.
동전은 상대방이 가져왔기 때문에 그 동전을 의심하세요.
이런 이상한 주관을 모델에 융합시켜 보아라.
상기 예에서 주관성이 없는 상태에서 균등분포(beta(1,1)를 설정했지만 이것은 상대방에게 유리한 표의 확률분포를 나타내기 쉽다.
예를 들면 다음과 같다.

observed = []
alpha, beta = 2, 0.5
p = pm.Beta('p', alpha=alpha, beta=beta)
이때 우리는 그것이 아래 그림과 같은 표현 방식이라는 것을 알 수 있다.

...정말 의심스럽군!
여기서 동전을 던져 분포가 어떻게 변할지 관찰해 보자.

봐라, 밖에 나왔다!

observed = [1]의 경우

아까의 그림과 거의 변화가 없다.
한편, 약하지만 쉽게 표현할 수 있다는 신념이 강해졌다.

어, 안이 드러났구나!

observed = [0]의 경우

신념을 어기고 내막이 드러나다.
이거 손발 안 해봤나봐.이런 표현 방식.

동전을 조금 더 넣을게요.


50회 던진 후 24회, 26회observed = [1]*24 + [0]*26로 변한 경우 다음과 같은 분포가 있다.

나는 이전에 유사한 분포를 본 적이 있다고 생각한다.
이 기사의 전반부는 주관성 없이 50개의 동전을 던졌고, 그 결과 24번의 정면 26번의 뒷면이 나왔다.
의심하기 시작해도 50번을 던지면 이 두 분포의 형상도 비슷하다.
아무리 강한 생각이라도 시도를 많이 하면 그 차이는 사라진다고 생각해요.
이번엔 그만하자, 점검을 위해서라면 동전을 3번 던져볼 수 있는 상황에서 각자 얼마만큼의 팁을 걸 것인지에 대한 기대치를 연결한다면 더 흥미로운 사례가 될 수 있다.

최후


본 보도보다 더 복잡하고 재미있는 일, 예를 들면 앞에서 소개한 것처럼 서적'파이썬 체험 베이즈 추론 파이MC MC 입문'에서 사용하고, 관심 있는 사람은 추천합니다.
자신도 생각이 있다면 뭔가를 써보고 싶어요.

좋은 웹페이지 즐겨찾기