다운로드
작성자: admin 작성일시: 2016-05-03 10:16:26 조회수: 6478 다운로드: 380
카테고리: 기초 수학 태그목록:

베이즈 정리

조건부확률을 구하는 다음 공식을 베이즈 정리(Bayesian rule)이라고 한다.

$$ P(A|B) = \dfrac{P(B|A)P(A)}{P(B)} $$

베이즈 정리의 증명은 다음과 같다.

(증명)

$$ P(A|B) = \dfrac{P(A,B)}{P(B)} \;\; \rightarrow \;\; P(A,B) = P(A|B)P(B) $$$$ P(B|A) = \dfrac{P(A,B)}{P(A)} \;\; \rightarrow \;\; P(A,B) = P(B|A)P(A) $$$$ P(A,B) = P(A|B)P(B) = P(B|A)P(A) $$$$ P(A|B) = \dfrac{P(B|A)P(A)}{P(B)} $$

여기에서 $P(A)$는 사전확률(prior)이라고 하며 사건 B가 발생하기 전에 가지고 있던 사건 A의 확률이다. 만약 사건 B가 발생하게 되면 이 정보를 반영하여 사건 $A$의 확률은 $P(A|B)$라는 값으로 변하게 되며 이를 사후확률(posterior)이라고 한다.

사후확률 값은 기존 확률값에 $\dfrac{P(B|A)}{P(B)}$라는 값을 곱하면 얻을 수 있다. 곱하는 $P(B|A)$는 가능도(likelihood)라고 하고 나누는 $P(B)$는 정규화 상수(normalizing constant)라고 한다.

베이즈 정리
$$ P(A|B) = \dfrac{P(B|A)P(A)}{P(B)} $$
  • $P(A|B)$: 사후확률(posterior). 사건 B가 발생한 후 갱신된 사건 A의 확률
  • $P(A)$: 사전확률(prior). 사건 B가 발생하기 전에 가지고 있던 사건 A의 확률
  • $P(B|A)$: 가능도(likelihood). 사건 A가 발생한 경우 사건 B의 확률
  • $P(B)$: 정규화 상수(normalizing constant): 확률의 크기 조정

베이즈 정리는 사건 $B$가 발생함으로써(사건 $B$가 진실이라는 것을 알게 됨으로써 즉 사건 $B$의 확률 $P(B)=1$이라는 것을 알게 됨으로써) 사건 $A$의 확률이 어떻게 변화하는지를 표현한 정리이다. 따라서 베이즈 정리는 새로운 정보가 기존의 추론에 어떻게 영향을 미치는지를 나타내고 있다.

베이즈 정리의 확장 1

만약 사건 $A_i$가 다음의 조건을 만족하는 경우,

  • 서로 교집합이 없고
$$ A_i \cap A_j = \emptyset $$
  • 모두 합쳤을 때 (합집합) 전체 표본 공간이면
$$ A_1 \cup A_2 \cup \cdots = \Omega $$

전체 확률의 법칙을 이용하여 다음과 같이 베이즈 정리를 확장할 수 있다.

$$ P(A_1|B) = \dfrac{P(B|A_1)P(A_1)}{P(B)} = \dfrac{P(B|A_1)P(A_1)}{\sum_i P(A_i, B)}= \dfrac{P(B|A_1)P(A_1)}{\sum_i P(B|A_i)P(A_i)} $$

$A_1 = A$, $A_2 = A^C$ 인 경우에는 다음과 같다.

$$ \begin{eqnarray} P(A|B) &=& \dfrac{P(B|A)P(A)}{P(B)} \\ &=& \dfrac{P(B|A)P(A)}{P(B,A) + P(B,A^C)} \\ &=& \dfrac{P(B|A)P(A)}{P(B|A)P(A) + P(B|A^C)P(A^C)} \\ &=& \dfrac{P(B|A)P(A)}{P(B|A)P(A) + P(B|A^C)(1 - P(A))} \end{eqnarray} $$

검사 시약 문제

베이즈 정리를 이용하여 다음과 같은 문제를 풀어보자.

제약사에서 환자가 특정한 병에 걸린지 확인할 수 있는 시약을 만들었다. 그 병에 걸린 환자에게 시약을 테스트한 결과 99%의 확률로 양성 반응을 보였다. 병에 걸린지 확인이 되지 않은 어떤 환자가 이 시약을 테스트한 결과 양성 반응을 보였다면 이 환자가 그 병에 걸려 있을 확률은 얼마인가? 99%일까?

이 문제를 확률론의 용어로 다시 정리하여 서술하여 보자.

우선 환자가 실제로 병에 걸린 경우를 사건 $D$ 라고 하자. 그러면 병에 걸려있지 않은 경우는 사건 $D^C$ 가 된다. 또 시약 테스트에서 양성 반응을 보이는 경우를 사건 $S$ 라고 하면 음성 반응을 보이는 경우는 사건 $S^C$ 이다.

현재 주어진 확률 값은 병에 걸린 환자에게 시약을 테스트하였을 때 양성 반응을 보이는 확률이다. 병에 걸렸다는 것은 추가된 조건 혹은 정보이므로 이 확률은 $P(S|D)$로 표기할 수 있다.

그런데 우리가 구해야 하는 값은 이것과 반대로 양성 반응을 보이는 환자가 병에 걸려있을 확률이다. 이 때에는 양성 반응을 보인다라는 것이 추가된 정보이므로 이 확률은 $P(D|S)$로 표기할 수 있다.

검사 시약 문제
  • 사건

    • 병에 걸리는 경우: 사건 $D$
    • 양성 반응을 보이는 경우: 사건 $S$
    • 병에 걸린 사람이 양성 반응을 보이는 경우: 조건부 사건 $S|D$
    • 양성 반응을 보이는 사람이 병에 걸려 있을 경우: 조건부 사건 $D|S$
  • 문제
    • $P(S|D)=0.99$가 주어졌을 때, $P(D|S)$를 구하라

베이즈 정리에서

$$ P(D|S) = \dfrac{P(S|D)P(D)}{P(S)} $$

임을 알고 있다. 그러나 이 식에서 우리가 알고 있는 것은 $P(S|D)$ 뿐이고 $P(D)$나 $P(S)$는 모르기 때문에 $ P(D|S)$ 현재로서는 구할 수 없다. 즉, 99%라고 간단히 말할 수 없다는 것이다.

추가 조사를 통해 필요한 정보를 다음과 같이 입수하였다고 하자.

  • 이 병은 전체 인구 중 걸린 사람이 0.2% 인 희귀병이다.
  • 이 병에 걸리지 않은 사람에게 시약 검사를 했을 때, 양성 반응, 즉 잘못된 결과(False Positive)가 나타난 확률이 5% 이다.

이를 확률론적 용어로 바꾸면 다음과 같다.

$$P(D) = 0.002$$$$P(S|D^C) = 0.05$$

베이즈 정리의 확장을 사용하면

$$ \begin{eqnarray} P(D|S) &=& \dfrac{P(S|D)P(D)}{P(S)} \\ &=& \dfrac{P(S|D)P(D)}{P(S,D) + P(S,D^C)} \\ &=& \dfrac{P(S|D)P(D)}{P(S|D)P(D) + P(S|D^C)P(D^C)} \\ &=& \dfrac{P(S|D)P(D)}{P(S|D)P(D) + P(S|D^C)(1-P(D))} \\ &=& \dfrac{0.99 \cdot 0.002}{0.99 \cdot 0.002 + 0.05 \cdot (1 - 0.002)} \\ &=& 0.038 \end{eqnarray} $$

즉, 시약 반응에서 양성 반응을 보이는 사람이 실제로 병에 걸려 있을 확률은 약 3.8% 에 불과하다.

pgmpy을 사용한 베이즈 정리 적용

pgmpy 패키지에서는 베이즈 정리를 적용할 수 있는 BayesianModel 클래스를 제공한다. 베이즈 정리를 적용하려면 조건부확률을 구현하기 위한 클래스 TabularCPD 클래스를 사용하여 사전확률과 가능도를 구현해야 한다. TabularCPD 클래스는 다음과 같이 만든다.

TabularCPD(variable, variable_card, value, evidence=None, evidence_card=None)
  • variable: 확률변수의 이름 문자열
  • variable_card: 확률변수가 가질 수 있는 경우의 수
  • value: 조건부확률 배열. 하나의 열(column)이 동일 조건을 뜻하므로 하나의 열의 확률 합은 1이어야 한다.
  • evidence: 조건이 되는 확률변수의 이름 문자열의 리스트
  • evidence_card: 조건이 되는 확률변수가 가질 수 있는 경우의 수의 리스트

TabularCPD 클래스는 원래는 조건부확률을 구현하기 위한 것이지만 evidence=None, evidence_card=None으로 인수를 주면 일반적인 확률도 구현할 수 있다.

우선 확률변수 X를 이용하여 병에 걸렸을 사전확률 $P(D)=P(X=1)$, 병에 걸리지 않았을 사전확률 $P(D^C)=P(X=0)$를 정의한다.

In [1]:
from pgmpy.factors.discrete import TabularCPD
In [2]:
cpd_X = TabularCPD('X', 2, [[1 - 0.002, 0.002]])
print(cpd_X)
+-----+-------+
| X_0 | 0.998 |
+-----+-------+
| X_1 | 0.002 |
+-----+-------+

다음으로는 양성 반응이 나올 확률 $P(S)=P(Y=1)$, 음성 반응이 나올 확률 $P(S^C)=P(Y=0)$를 나타내는 확률변수 $Y$를 정의한다.

확률변수 $Y$의 확률을 베이즈 모형에 넣을 때는 TabularCPD 클래스를 사용한 조건부확률 $P(Y|X)$의 형태로 넣어야 하므로 다음처럼 조건부확률 $P(Y|X)$를 구현한다.

In [3]:
cpd_Y_on_X = TabularCPD('Y', 2, np.array([[0.95, 0.01], [0.05, 0.99]]),
                        evidence=['X'], evidence_card=[2])
print(cpd_Y_on_X)
+-----+------+------+
| X   | X_0  | X_1  |
+-----+------+------+
| Y_0 | 0.95 | 0.01 |
+-----+------+------+
| Y_1 | 0.05 | 0.99 |
+-----+------+------+

이제 이 확률변수들이 어떻게 결합되어 있는지는 나타내는 확률모형인 BayesianModel 클래스 객체를 만들어야 한다.

BayesianModel(variables)
  • variables: 확률모형이 포함하는 확률변수 이름 문자열의 리스트

BayesianModel 클래스는 다음 메서드를 지원한다.

  • add_cpds: 조건부확률을 추가
  • check_model: 모형이 정상적인지 확인. True면 정상적인 모형
In [4]:
from pgmpy.models import BayesianModel

model = BayesianModel([('X', 'Y')])
model.add_cpds(cpd_X, cpd_Y_on_X)
model.check_model()
Out:
True

BayesianModel 클래스는 변수 제거법(VariableElimination)을 사용한 추정을 제공한다. VariableElimination 클래스로 추정(inference) 객체를 만들고 이 객체의 query 메서드를 사용하면 사후확률을 계산한다.

query(variables, evidences)
  • variables: 사후확률을 계산할 확률변수의 이름 리스트
  • evidences: 조건이 되는 확률변수의 값을 나타내는 딕셔너리

여기에서는 pgmpy 패키지를 이용하여 베이즈 정리를 적용할 수 있다는 것만 알면 된다. 자세한 내용은 추후 확률적 그래프 모형(Probabilistic Graphical Model)에서 다룬다.

In [5]:
from pgmpy.inference import VariableElimination

inference = VariableElimination(model)
posterior = inference.query(['X'], evidence={'Y': 1})
print(posterior['X'])
+-----+----------+
| X   |   phi(X) |
+=====+==========+
| X_0 |   0.9618 |
+-----+----------+
| X_1 |   0.0382 |
+-----+----------+

연습 문제 7.3.3

몬티 홀 문제(Monty Hall problem)는 다음과 같은 확률문제이다.

세 개의 문 중에 하나를 선택하여 문 뒤에 있는 선물을 가질 수 있는 게임쇼에 참가했다. 한 문 뒤에는 자동차가 있고, 나머지 두 문 뒤에는 염소가 있다. 이때 어떤 사람이 예를 들어 1번 문을 선택했을 때, 게임쇼 진행자는 3번 문을 열어 문뒤에 염소가 있음을 보여주면서 1번 대신 2번을 선택하겠냐고 물었다. 참가자가 자동차를 가지려할 때 원래 선택했던 번호를 바꾸는 것이 유리할까?

문의 위치를 0, 1, 2라는 숫자로 표현하면 다음과 같은 확률변수를 사용하여 이 문제를 풀 수 있다.

  1. 자동차가 있는 문을 나타내는 확률변수 $X$. 값은 0, 1, 2를 가질 수 있다.
  2. 참가자가 선택한 문을 나타내는 확률변수 $Y$. 값은 0, 1, 2를 가질 수 있다.
  3. 진행자가 열어준 문을 나타내는 확률변수 $Z$. 값은 0, 1, 2를 가질 수 있다.

이 세 확률변수들의 조건부확률 $P(Z|X,Y)$를 pgmpy 패키지의 TabularCPD 클래스로 구현하라.

베이즈 정리의 확장 2

베이즈 정리는 사건 $A$의 확률이 사건 $B$에 의해 갱신(update)된 확률을 계산한다. 그런데 만약 이 상태에서 또 추가적인 사건 $C$가 발생했다면 베이즈 정리는 다음과 같이 쓸 수 있다.

$$ P(A|B,C) = \dfrac{P(C|A,B)P(A|B)}{P(C|B)} $$

위 식에서 $P(A|B,C)$는 $B$와 $C$가 조건인 $A$의 확률이다. 즉 $P(A| (B \cap C))$를 뜻한다.

이 공식을 사건 $A$와 $C$ 만 있는 경우와 비교해 보면 위 공식을 쉽게 외울 수 있다.

$$ P(A|C) = \dfrac{P(C|A)P(A)}{P(C)} $$

(증명)

$$ P(A,B,C) = P(A|B,C)P(B,C) = P(A|B,C)P(C|B)P(B)$$$$ P(A,B,C) = P(C|A,B)P(A,B) = P(C|A,B)P(A|B)P(B) $$$$ P(A|B,C)P(C|B)P(B) = P(C|A,B)P(A|B)P(B) $$$$ P(A|B,C) = \dfrac{P(C|A,B)P(A|B)}{P(C|B)} $$

연습 문제 7.3.4

다음 식을 증명하라.

$$ P(A|B,C) = \dfrac{P(B|A,C)P(A|C)}{P(B|C)} $$

질문/덧글

베이즈 정리 시약 약성 반응 결론 문의 best*** 2017년 9월 29일 2:45 오후

'시약 반응에서 양성 반응을 보이는 사람이 실제로 병에 걸려 있을 확률은 약 3.8% 에 불과하다.'

'모든 사람들 중 실제로 병에 걸렸고, 시약 검사 시 양성 반응이 나올 확률이 3.8% 다.' 라는 의미가 맞는지요.

시약에 양성 반응을 보이는 사람이 병에 걸렸을 확률 99%, 시약 오류 가능성 5%로 시약의 정확도는 높은 수준이지만

'시약으로 판별할 수 있는 질병의 발병 확률(0.2%)이 낮아 시약 검사의 효율성이 3.8% 수준이다.' 라는 의미로 해석해도 될까요?

답변: 베이즈 정리 시약 약성 반응 결론 문의 관리자 2017년 10월 2일 10:49 오전

'시약 반응에서 양성 반응을 보이는 사람이 실제로 병에 걸려 있을 확률'은 $P(D|S)$이고
''모든 사람들 중 실제로 병에 걸렸고, 시약 검사 시 양성 반응이 나올 확률'은 $P(D,S)$로 다른 값입니다.

검사시약 문제에서, rlaw*** 2018년 12월 2일 11:14 오전

아주 작은 오타가 있어서 남깁니다.

검사시약문제 내용에서,

현재 주어진 확률 값은 병에 "결"린 환자에게 => "결" -> "걸 "

수고하십시오.

답변: 검사시약 문제에서, 관리자 2018년 12월 6일 6:16 오후

수정하였습니다. 지적 감사합니다.