읽기일기

Think Bayes (5) 공산과 가산


파이썬을 활용한 베이지안 통계, 앨런 B. 다우니 지음, 권정민 옮김/한빛미디어

5.1 공산

확률을 나타내는데 0과 1사이의 숫자를 사용하는 것만 있는 것은 아니다. 공산(odds)이라고 부르는 방법이 있다. 혹은 승산이라고 불리는 방법이 있다. 예를 들어 우리 팀의 승률이 75%라면 이길 가능성이 질 가능성의 3배이므로 확률은 3대 1, 혹은 3:1 로 표시할 수 있다. 확률이 낮은 경우 반대 형식의 공산으로 표기하는 경우가 더 많다. 즉, 내가 이길 확률이 10%라면, 보통 공산이 9:1 이라고 말한다.

확률 값이 주어졌을 때의 공산은 다음과 같이 계산할 수 있다.

정수로 나타낸 공산은 다음과 같이 계산할 수 있다.

분자와 분모 형태로 나타내고 싶을 땐 다음과 같이 바꿀 수 있다.

5.2 베이즈 이론의 공산 형태

베이즈 이론을 다시 살펴보면 다음과 같다.

$$p(H|D) = \frac{p(H) p(D|H)}{p(D)}$$

A와 B라는 두개의 가설이 있을 경우, 그 둘의 비율을 다음과 같이 나타낼 수 있다.

$$\frac{p(A|D)}{p(B|D)} = \frac{p(A) p(D|A)}{p(B) p(D|B)}$$

정규화 상수 $p(D)$가 사라졌음을 유의하자.

만약 A가 서로 상호 배제적이고, 전체 포괄적이라면 $p(B) = 1- p(A)$라고 할 수 있다. 이 때, 사전 확률비, 사후 확률비를 공산을 이용해서 나타낼 수 있다.

A에 대한 공산을 $o(A)$로 나타낸다면, 위의 식은 아래와 같이 나타낼 수 있다.

$$o(A|D) = o(A) \frac{p(D|A)}{p(D|B)}$$

즉, 사후 공산은 사전 공산과 우도비의 곱이다.

이를 쿠키 문제에 적용하여 보면, 사전 확률이 50%이므로 사전 공산은 1:1, 우도비는 (3/4) / (1/2) 이므로, 사후 공산은 3:2로 확률 3/5가 되는 것을 알 수 있다.

5.3 올리버의 혈액형

다음은 맥케이의 저서에 있는 문제다.

범죄 현장에서 두 사람의 혈흔을 발견햇다. 용의자 올리버는 검사 결과 O형이 나왔다. 두 혈흔의 혈액형은 O형(인구의 60% 빈도로 나타남)과 AB형(1% 빈도로 나타남)으로 나타났다. 이 데이터가 올리버가 범인 중 한명이라는 질문에 대한 증거가 될 수 있을까?

앞의 베이즈 이론 공산 식을 변형하면 다음과 같은 식을 얻을 수 있다.

$$\frac{o(A|D)}{o(A)} = \frac{p(D|A)}{p(D|B)}$$

왼족은 사후 공산과 사전 공산의 비율이다. 오른쪽은 우도비로, 베이즈 요인(Bayes factor)라고 한다.

베이즈 요인이 1보다 크면, 데이터는 B의 가정보다 A의 가정에 아깝다는 뜻이다. 또한 공산의 비가 1보다 크면, 데이터 상에서 전보다 공산이 커졌다는 뜻이다.

만약 베이즈 요인이 1보다 작으면, 데이터가 가정 B에 비해 가정 A일 때 더 적다는 뜻이므로 A의 공산은 낮아진다.

마지막으로 베이즈 요인이 1인 경우, 데이터는 각 가설에서 동일하므로 공산은 변하지 않는다.

올리버의 혈액형 문제로 돌아가자.

만약 올리버가 혈흔을 남겨놓은 사람 중 하나라면, 올리버는 O형 샘플에 대한 설명이 되고, 이 때의 확률은 임의의 사람이 AB형 혈액형을 가질 확률인 1%가 된다.

만약 올리버가 혈흔을 남기지 않았다면 설명해야 할 경우가 2개 필요하다. 전체 인구에서 임의로 두 사람을 검사하였을 때, 한명이 O형이고 한명이 AB형일 확률을 생각하였을 때 2가지 경우가 있을 수 있다. 첫번째 사람이 O, 두번째가 AB이거나 그 반대의 경우다. 총 확률은 2 (0.6) (0.01) = 1.2% 이다.

따라서 올리버가 현장에 혈흔을 남긴 사람이 아닐 확률에 대한 우도가 약간 더 높으므로 혈액 데이터는 올리버의 유죄에 대한 반증이 된다.

5.4 가산

사전 분포와 사후 분포를 생성하는 것 외에도, 실제 문제들은 정규화, 덧셈과 최대값, 최소값 등을 조합하여 사용하고 있다.

여기서는 덧셈과 최대값에 대해서 살펴보자.

6면제 주사위 세개를 한꺼번에 굴렸을 때, 그 합의 분포가 어떻게 되는지를 생각하여 보자. 이를 계산할 수 있는 방법은 두 가지가 있다.

  • 시뮬레이션 : 하나의 주사위에 대한 Pmf를 생성하고 이를 사용하여 샘플을 생성한 뒤, 이들을 더한다.
  • 나열 : 주어진 두 개의 Pmf를 사용하여, 모든 가능한 수의 쌍을 나열하고 이 합의 분포를 계산한다.

두가지 방법 모두 thinkbayes를 이용하여 사용가능하다. 순서대로 살펴보자.

먼저 하나의 주사위를 나타내는 클래스를 만들자.

이제 6면체 주사위를 생성하고, SampleSum을 사용하여 주사위를 1000번 굴린 샘플 값을 생성하자. 이 함수는 n개의 임의의 합을 생성하여 이 분포를 Pmf객체로 만든다.

이 시뮬레이션은 결과가 근사값을 보여줄 뿐 정확하지는 않다는 것이다. n이 커질 수록 정확해지지만, 실행 시간이 증가한다.

또 다른 방벙은 모든 값의 쌍을 나열하고 이를 더하여 확률을 계산하는 것이다. 이 기능은 Pmf.__add__에 구현할 것이다.

이 함수는 다음과 같이 사용된다.

이 방법은 각 Pmf로부터 랜덤 선택이 독립적이라는 가정 하에서 이루어졌다.

5.5 최대값

위의 주사위 세개의 문제에서 최대값 분포가 어떤지 생각해보자.

최대 값 분포 계산에는 세 가지 방법이 있다.

  • 시뮬레이션 : 단일 선택에 대한 분포를 나타내는 Pmf를 만들어 랜덤 샘플을 생성하고, 최대값을 찾아 누적한다.
  • 나열 : 주어진 두 개의 Pmf들로부터 모든 가능한 값의 쌍을 나열하고 최대 값의 분포를 구한다.
  • 멱법 : PmfCdf로 바꿀 때 최대값에서 Cdf를 구한다.

최대값을 시뮬레이션 하는 코드는 앞에서와 비슷하다.

나열법의 경우도 마찬가지이다.

나열법의 코드는 실행시간은 $m^2$에 비례한다.

마지막 아이디어의 경우, Pmf를 Cdf로 변경하면 계산이 훨씬 빠르게 된다. 누적 분포 함수의 정의를 살펴보면, $ CDF(x) = p(X \leq x) $으로, 분포에서 임의로 선택한 값이 x보다 같거나 작을 확률이다.

CDF1에서 X를 고르고, CDF2에서 Y를 고르고 Z = max(X,Y)를 계산한다고 한다면, Z가 5이하일 경우는 얼마일까? 이 경우 X, Y가 모두 5이하여야 한다.

X와 Y의 선택이 독립적인 경우, 다음 식이 성립한다.

$$CDF_Z(5) = CDF_1(5) CDF_2(5)$$

이를 일반화 하면, z 값 이하의 확률은 다음과 같다.

$$CDF_Z(z) = CDF_1(z) CDF_2(z)$$

동일한 분포에서 k개의 값을 가져오는 특수한 경우는 다음과 같다.

$$CDF_k(z) = CDF_1(z)^k$$

즉, k개의 값 중 최대값의 분포를 찾으려면 주어진 Cdf의 확률을 나열한 후 이를 k회 곱하면 된다.

Pmf에도 동일한 기능의 메서드인 Pmf.Max가 있다.

따라서 최고 속성 값의 분포를 계산하는 것은 다음과 같이 할 수 있다.

5.6 혼합

다음과 같은 주사위가 있다고 하자.

  • 4면체 5개
  • 6면체 4개
  • 8면체 8개
  • 12면체 2개
  • 20면체 1개

상자의 주사위를 골라서 굴렷다. 이 때의 결과값의 분포는 어떻게 될까?

우리는 어떤 주사위인지 모르기 때문에, 결과 분포는 각 주사위에 대한 균등 분포의 혼합 형태로 나타나게 된다.

여기서는 각 주사위를 뽑을 확률이 동일하다고 가정하였으나 각 주사위에 선택에 대한 확률을 달리 하고자 한다면 다음과 같이 하면 된다.

주사위별로 가중치가 연결될 것이다.

이 알고리즘을 캡슐화한 MakeMixture라는 함수가 있다.

5.7 토의

분포의 덧셈이나 최대값을 구하는 방법을 살펴보았다.


Add a Comment Trackback