Network Inference

네트워크 추론

확률모형에서 일부 확률변수의 값이 주어졌을 때 다른 값들을 알아내는 것을 추론(inference)이라고 한다.

조건부 확률분포함수 $p(X_{\text{unknown}}|\{X\}_{\text{known}})$ 을 알면 일부 확률변수의 값 $\{X\}_\text{known}$이 주어졌을 때 다른 확률변수 $X_\text{unknown}$ 의 확률 $p(X_\text{unknown})$ 을 알 수 있으므로, 추론은 조건부확률분포함수를 알아내는 것과 같다.

앞서 사용했던 예를 다시 들어보자. 확률변수 A, B, C가 각각 어떤 학생의 건강상태, 공부시간, 시험성적을 나타낸 것이고 모두 0, 1, 2(하,중,상)의 세 가지 값을 가진다. 이 확률변수를 아래 코드를 통해 그래프 확률모형으로 구현한 후 그것을 기반으로 다음 문제를 풀어 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
from pgmpy.factors.discrete import TabularCPD
from pgmpy.models import BayesianModel

P_A = TabularCPD('A', 3, [[0.1, 0.6, 0.3]])
P_B_I_A = TabularCPD('B', 3,
np.array([[0.6, 0.2, 0.2], [0.3, 0.5, 0.2], [0.1, 0.3, 0.6]]),
evidence=['A'], evidence_card=[3])
P_C_I_B = TabularCPD('C', 3,
np.array([[0.8, 0.1, 0.1], [0.1, 0.8, 0.1], [0.1, 0.1, 0.8]]),
evidence=['B'], evidence_card=[3])

model = BayesianModel([('A', 'B'), ('B', 'C')])
model.add_cpds(P_A, P_B_I_A, P_C_I_B)
  1. 이 학생의 시험성적은 어떤 확률분포를 가지는가? 어떤 성적을 맞을 확률이 가장 높은가?
  2. 이 학생의 건강상태가 상(2)이었다면 어떤 성적을 맞을 확률이 가장 높은가?
  3. 이 학생은 공부 시간이 적었지만(0) 시험성적이 좋았다(2). 이 학생의 건강상태는 어땠을까?

1번 문제는 무조건부 확률분포함수 $P(C)$ 를 찾는 문제이다. 2번 문제는 조건부 확률분포함수 $P(C|A=2)$ 를 찾는 것이고, 3번 문제는 조건부 확률분포함수 $P(A|B=0, C=2)$ 를 찾는 문제이다.

베이지안 네트워크나 마코프 네트워크같은 그래프 확률모형에서 추론을 할 때는

  • 변수제거(variable elimination)
  • 신뢰전파(belief propagation)

방법을 사용한다. 이 방법들은 모두 Exact inference 에 해당한다.

1) 변수제거

값을 알고 있는 확률변수 혹은 무조건부 확률변수분포를 알고있는 확률변수부터 네트워크를 따라 차례대로 확률분포를 계산하는 방식을 변수제거(VE:Variable Elimination) 방법이라고 한다.

위에서 예로 든 모형에서 특정 확률변수의 무조건부 확률분포를 구하는 방법을 알아보자. 우선 C의 분포함수를 알 때 B의 분포함수는 다음처럼 구한다.

$B=1, B=2$ 인 경우에도 같은 방법으로 계산한다.

이번에는 C의 분포함수를 계산해보자.

여기서 $\sum_{A,B}$ 는 A와 B가 가질 수 있는 모든 경우의 조합을 뜻한다.

따라서 아래와 같이 $P(C=0)$을 구할 수 있다.

즉, 확률변수 B의 분포가 이미 계산된 상태라면 C의 분포에 대해 확률변수 A의 영향은 없어진다.

pgmpy에서는 VariableElimination클래스를 사용해 변수제거법을 적용할 수 있다. 객체를 생성할 때 인수로 네트워크모형을 넣어 생성하고, query 메서드를 사용해 추론을 진행한다. 메서드에 들어가는 인수는 확률분포를 구하려는 확률변수의 리스트에 해당하는 variable_list 와 알고 있는 확률변수 값의 딕셔너리형태인 evidence 가 있다.

아무런 조건이 없을 경우 시험성적의 확률분포는 다음과 같다.

1
2
3
4
from pgmpy.inference import VariableElimination

infer = VariableElimination(model)
print(infer.query(["C"])["C"])

만약 건강 상태가 좋았으면 evidence={'A':2} 인수를 적용한다. 이 때는 좋은 성적을 받을 가능성이 가장 높아진다.

1
print(infer.query(["C"], evidence={"A": 2})["C"])

시험성적과 공부시간의 정보가 주어진다면 다음처럼 건강상태를 유추할 수도 있다.

1
print(infer.query(["A"], evidence={"B": 0, "C": 2})["A"])

몬티 홀 문제

변수제거방법을 이용해 몬티 홀 문제를 풀어보자.

0, 1, 2로 표시된 3개의 문 중에 자동차가 있는 문을 나타내는 확률변수는 C, 참가자가 고른 문은 P, 진행자가 여는 문을 H라고 하자.

세 문 중에 자동차가 있는 문과 참가자가 고르는 문의 확률은 동일하게 1/3이다.

1
2
3
4
from pgmpy.factors.discrete import TabularCPD

cpd_c = TabularCPD('C', 3, [[0.33, 0.33, 0.33]])
print(cpd_c)

1
2
cpd_p = TabularCPD('P', 3, [[0.33, 0.33, 0.33]])
print(cpd_p)

하지만 진행자가 여는 문은 자동차가 있는 문의 위치와 참가자가 선택한 문에 따라서 달라진다.

1
2
3
4
5
cpd_h = TabularCPD('H', 3, [[0,   0, 0, 0, 0.5, 1, 0, 1, 0.5], 
[0.5, 0, 1, 0, 0, 0, 1, 0, 0.5],
[0.5, 1, 0, 1, 0.5, 0, 0, 0, 0 ]],
evidence=['C', 'P'], evidence_card=[3, 3])
print(cpd_h)

위를 베이지안네트워크 확률모형으로 만들어보자. 진행자의 선택 H는 자동차의 위치 C와 참가자의 선택 P의 영향을 동시에 받는 머리-머리 결합이다.

1
2
3
4
5
6
7
8
9
10
11
from pgmpy.models import BayesianModel
from IPython.core.display import Image
from networkx.drawing.nx_pydot import to_pydot

model_monty = BayesianModel([('C', 'H'), ('P', 'H')])
model_monty.add_cpds(cpd_c, cpd_p, cpd_h)

d = to_pydot(model_monty)
d.set_dpi(300)
d.set_margin(0.2)
Image(d.create_png(), width=400)

그리고 변수제거방법을 사용해 H를 추론해보자.

1
2
3
from pgmpy.inference import VariableElimination

infer = VariableElimination(model_monty)

참가자가 0번 문을 선택하는 경우 진행자는 1번 혹은 2번 문을 연다. 이 때 진행자가 1번 문을 연다면 차가 2번 문에 있을 확률이 0번 문에 있을 확률의 2배임을 아래와 같이 확인할 수 있다.

1
2
posterior_c = infer.query(['C'], evidence={'P': 0, 'H': 1})
print(posterior_c['C'])

참가자가 0번 문을 선택했을 때 진행자가 2번 문을 연다면, 차가 1번 문에 있을 확률이 0번문에 있을 확률의 2배이다.

1
2
posterior_c = infer.query(['C'], evidence={'P': 1, 'H': 2})
print(posterior_c['C'])

따라서 참가자는 항상 선택을 바꾸는 것이 확률적으로 유리하다.

2) 신뢰전파

신뢰전파(BE;Belief Propagation) 방법은 메시지 전달(message passing)방법이라고도 한다. 여기에서는 선형 사슬(linear chain)형태의 마코프 네트워크를 예로 들어 설명하겠지만, 일반적인 네트워크에서도 성립한다.

$X_1, \cdots , X_n$ 의 $N$ 개 확률변수가 선형사슬로 연결된 마코프 네트워크의 결합확률분포는 다음과 같다.

사슬 중간에 있는 $X_n$ 의 확률분포를 구하려면 전체확률의법칙에 따라 $X_n$ 을 제외한 나머지 확률변수들이 가질 수 있는 모든 경우의 확률을 더하면 된다.

pgmpy에서는 BeliefPropagation 클래스를 사용해 변수제거법을 적용할 수 있다.

사용법은 VariableElimination 과 같다.

Share