다운로드
작성자: admin 작성일시: 2018-04-20 20:39:31 조회수: 651 다운로드: 36
카테고리: 기초 수학 태그목록:

베이지안 네트워크

그래프 확률 모형

다수의 확률변수의 결합분포를 구해야 하는 경우를 생각하자. 모든 확률변수가 서로 영향을 미치는 아주 복잡한 경우는 사실 흔하지 않다. 현실에서는 특정한 몇개의 확률분포만이 서로 인과 관계 등에 영향을 미친다. 이렇게 다수의 확률변수 중 특정한 소수의 확률변수들이 가지는 관계를 그래프로 표현한 것을 그래프 확률 모형(graphical probability model)이라고 한다.

예를 들어 a, b, c 세개의 확률변수가 있고 각 확률변수가 0, 1, 2 세가지의 값만 가질 수 있는 카테고리 확률변수인 경우 이 세 확률변수의 결합분포는 다음과 같이 표로 나타낼 수 있다. 이 표는 $3^3-1=26$개의 모수를 가진다. (합이 1이 되어야 하므로 하나는 다른 값들에 의존한다.)

a b c p(a, b, c)
0 0 0 p(a=0,b=0,c=0)
0 0 1 p(a=0,b=0,c=1)
0 0 2 p(a=0,b=0,c=2)
0 1 0 p(a=0,b=1,c=0)
0 1 1 p(a=0,b=1,c=1)
0 1 2 p(a=0,b=1,c=2)
0 2 0 p(a=0,b=2,c=0)
0 2 1 p(a=0,b=2,c=1)
0 2 2 p(a=0,b=2,c=2)
1 0 0 p(a=1,b=0,c=0)
1 0 1 p(a=1,b=0,c=1)
1 0 2 p(a=1,b=0,c=2)
1 1 0 p(a=1,b=1,c=0)
1 1 1 p(a=1,b=1,c=1)
1 1 2 p(a=1,b=1,c=2)
1 2 0 p(a=1,b=2,c=0)
1 2 1 p(a=1,b=2,c=1)
1 2 2 p(a=1,b=2,c=2)
2 0 0 p(a=2,b=0,c=0)
2 0 1 p(a=2,b=0,c=1)
2 0 2 p(a=2,b=0,c=2)
2 1 0 p(a=2,b=1,c=0)
2 1 1 p(a=2,b=1,c=1)
2 1 2 p(a=2,b=1,c=2)
2 2 0 p(a=2,b=2,c=0)
2 2 1 p(a=2,b=2,c=1)
2 2 2 p(a=2,b=2,c=2)

그런데 만약 a는 b의 원인이 되고, b는 c의 원인이 되는 직접적인 상관관계를 가진다면 다음과 같은 그래프로 나타낼 수 있다. 원인과 결과가 되는 관계를 조건부 확률분포로 표현할 수 있다. 예를 들어 a가 b의 원인이 된다면 이 두 확률변수의 관계를 $p(b|a)$로 나타낼 수 있다.

여기에서 중요한 점은 a와 c는 직접적인 관계를 없지만 상관관계가 있을 수 있다는 점이다. 예를 들어 a-b, b-c의 관계가 모두 양의 상관관계, 즉 원인이 되는 확률변수의 값이 커지면 결과가 되는 확률변수의 값도 커진다면 a가 커졌을 때 b도 커지고 따라서 c도 커지므로 a와 c가 양의 상관관계를 가지게 된다.

이러한 그래프를 방향성 그래프(directed graph)라고 한다. 방향성 그래프에서 확률변수는 하나의 노드(node) 또는 정점(vertex)로 나타내고 인과관계는 화살표 간선(edge, link)으로 나타낸다.

우리가 다루는 방향성 그래프는 화살표가 여러 확률변수를 거쳐 자기 자신에게 돌아오는 루프(loop)가 없는 DAG(Directed Acyclic Graph)모형이다.

확률변수가 방향성 그래프로 나타난 경우에는 우리가 알고 있는 인과 관계 즉, 두 변수간의 조건부 확률분포를 사용하여 전체 결합분포를 다음과 같이 좀더 간단한 팩터(factor)들의 곱으로 계산할 수 있다. 예를 들어 위의 그래프에서 전체 결합분포는 다음과 같다.

$$ p(a, b, c) = p(a)p(b|a)p(c|b) $$

결합확률분포를 이루는 팩터를 각각 표로 나타내면 다음과 같다.

a $p(a)$
0 $p(a=0)$
1 $p(a=1)$
2 $p(a=2)$
b $p(b\vert a=0)$ $p(b\vert a=1)$ $p(b\vert a=2)$
0 $p(b=0\vert a=0)$ $p(b=0\vert a=1)$ $p(b=0\vert a=2)$
1 $p(b=1\vert a=0)$ $p(b=1\vert a=1)$ $p(b=1\vert a=2)$
2 $p(b=2\vert a=0)$ $p(b=2\vert a=1)$ $p(b=2\vert a=2)$
c $p(c\vert b=0)$ $p(c\vert b=1)$ $p(c\vert b=2)$
0 $p(c=0\vert b=0)$ $p(c=0\vert b=1)$ $p(c=0\vert b=2)$
1 $p(c=1\vert b=0)$ $p(c=1\vert b=1)$ $p(c=1\vert b=2)$
2 $p(c=2\vert b=0)$ $p(c=2\vert b=1)$ $p(c=2\vert b=2)$

위 표에서 모수의 수는 $(3-1) + (3^2-1)\times2 = 18$이다. 변수간의 인과관계라는 추가 정보로 인해 우리가 찾아야하는 모수의 숫자가 크게 감소하였다. 이렇게 우리가 알고 있는 확률변수간의 정보를 그래프를 이용하여 추가하면 찾고자하는 문제를 더 간단하게 만들 수 있다.

조건부 독립

조건부 독립(conditional independence)은 일반적인 독립과 달리 조건이 되는 확률변수가 존재해야 한다.

일반적으로는 확률변수 a, b가 독립인 정의는 다음과 같다.

$$ p(a, b) = p(a)p(b) $$

조건부 독립은 조건이 되는 c라는 확률변수에 대한 조건부 결합확률분포에 대해 다음이 만족되어야 한다.

$$ p(a, b|c) = p(a|c) p(b|c) $$

즉, c에 대한 조건부 결합확률분포가 조건부 확률분포의 곱으로 나타난다.

기호로는 다음과 같이 표기한다.

$$ a \text{⫫} b \;\vert\; c $$

같은 방식으로 무조건부 독립은 다음과 같이 표기하도 한다.

$$ a \text{⫫} b \;\vert\; \emptyset $$

a, b가 c에 대해 조건부 독립이면 다음도 만족한다.

$$ p(a|b,c) = p(a|c) $$$$ p(b|a,c) = p(b|c) $$

주의할 점은 조건부 독립과 (무조건부) 독립은 관계가 없다는 점이다. 즉, 두 확률변수가 독립이라고 항상 조건부 독립이 되는 것도 아니고 조건부 독립이라고 꼭 독립이 되는 것도 아니다.

$$ p(a,b) = p(a)p(b) \;\; \bcancel{\implies} \;\; p(a,b|c) = p(a|c)p(b|c) $$$$ p(a,b|c) = p(a|c)p(b|c) \;\; \bcancel{\implies} \;\; p(a,b) = p(a)p(b) $$

d-separation

d-separation(directed separation) 정리는 방향성 그래프 모형에서 어떤 두 노드(확률변수)가 조건부 독립인지 아닌지 알아보는 간단한 방법이다.

case 1

우선 다음과 같이 확률변수 a,b가 공통의 부모 c를 가지는 경우를 보자. 이를 tail-to-tail 구조라고 한다.

이 상태로는 a와 b는 독립이 아니다. 그런데 만약 c의 값이 이미 알려진 상태이면 결합확률은 조건부 결합확률이 된다. 따라서 다음과 같이 조건부 독립이 성립한다.

$$ p(a,b|c) = \dfrac{p(a, b, c)}{p(c)} = \dfrac{p(a|c)p(b|c)p(c)}{p(c)} = p(a|c)p(b|c) $$

이런 상태를 c가 a,b 사이를 막고있다(block)고 한다.

case 2

다음으로는 인과관계인 확률변수 a, b 사이에 c가 끼어 있는 경우를 살펴보자. 이는 head-to-tail 구조라고 한다.

이 경우에도 a와 b는 독립이 아니지만 c의 값이 이미 알려진 상태이면 결합확률은 조건부 결합확률이 되어 다음과 같이 조건부 독립이 성립한다.

$$ p(a,b|c) = \dfrac{p(a, b, c)}{p(c)} = \dfrac{p(a)p(c|a)p(b|c)p(c)}{p(c)} = p(a|c)p(b|c) $$

베이즈 정리를 사용하면 위 식을 증명할 수 있다. 위의 경우와 마찬가지로 c가 a,b 사이를 막고(block) 있다.

case 3

마지막으로 두 확률변수 a, b 를 부모로 가지는 c 있는 경우를 살펴보자. 이러한 구조는 V-구조(V-structure) 또는 head-to-head 구조라고 한다.

이 경우에는 앞의 두 경우와 달리 a와 b가 독립이다.

$$ p(a,b,c) = p(a)p(b)p(c|a,b) $$$$ p(a,b) = \sum_c p(a)p(b)p(c|a,b) = p(a)p(b) $$

하지만 c의 값이 이미 알려진 상태를 살펴보면 조건부 독립이 성립하지 않는다. 즉 c가 a,b 사이를 막고 있지 않다.

예를 들어 a가 늦잠을 자는 것을 나타내는 확률변수, b가 길이 막히는 것을 나타내는 확률변수, c가 지각하는 것을 나타내는 확률변수라고 할 때, 늦잠을 자는 것과 길이 막히는 것은 서로 독립이다.

하지만 일단 지각이 발생한 상황에서는 a, b는 서로 독립이 아니며 이 경우에는 반-상관관계를 가진다. 즉, 늦잠을 자지 않았다면 길이 막혔을 가능성이 높아지고 길이 막히지 않았다면 늦잠을 잤을 가능성이 높아진다. 이러한 것을 explaining-out이라고 한다.

이러한 상황은 a,b가 c의 직접 부모가 아니라 다음과 같이 후손(descendent)인 경우에도 성립한다.

이상의 상황을 정리한 것이 바로 d-separation 정리이다.

만약 노드 a, b 사이의 모든 경로가 막혀있으면 a와 b는 둘 사이를 막고 있는 확률변수에 대해 조건부 독립이다.

베이지안 네트워크를 사용한 몬티 홀 문제

In:
from pgmpy.factors.discrete import TabularCPD
In:
cpd_c = TabularCPD('C', 3, [[0.33, 0.33, 0.33]])
print(cpd_c)
+-----+------+
| C_0 | 0.33 |
+-----+------+
| C_1 | 0.33 |
+-----+------+
| C_2 | 0.33 |
+-----+------+
In:
cpd_p = TabularCPD('P', 3, [[0.33, 0.33, 0.33]])
print(cpd_p)
+-----+------+
| P_0 | 0.33 |
+-----+------+
| P_1 | 0.33 |
+-----+------+
| P_2 | 0.33 |
+-----+------+
In:
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)
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| C   | C_0 | C_0 | C_0 | C_1 | C_1 | C_1 | C_2 | C_2 | C_2 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| P   | P_0 | P_1 | P_2 | P_0 | P_1 | P_2 | P_0 | P_1 | P_2 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| H_0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.5 | 1.0 | 0.0 | 1.0 | 0.5 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| H_1 | 0.5 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.5 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| H_2 | 0.5 | 1.0 | 0.0 | 1.0 | 0.5 | 0.0 | 0.0 | 0.0 | 0.0 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
In:
from pgmpy.models import BayesianModel

model = BayesianModel([('C', 'H'), ('P', 'H')])
model.add_cpds(cpd_c, cpd_p, cpd_h)
model.check_model()
Out:
True
In:
import networkx as nx

nx.draw_networkx(model.to_directed())
In:
model.is_active_trail('C', 'P')
Out:
False
In:
model.get_independencies()
Out:
(C _|_ P)
(P _|_ C)
In:
model.is_active_trail('C', 'P', observed='H')
Out:
True
In:
from pgmpy.inference import VariableElimination

infer = VariableElimination(model)
In:
from pgmpy.factors import factor_product
j = infer.factors['C'][0]
print(j)
+-----+----------+
| C   |   phi(C) |
+=====+==========+
| C_0 |   0.3300 |
+-----+----------+
| C_1 |   0.3300 |
+-----+----------+
| C_2 |   0.3300 |
+-----+----------+
In:
from pgmpy.factors import factor_product

posteriors = infer.query(['C', 'H'], evidence={'P': 0})
print(posteriors['H'])
+-----+----------+
| H   |   phi(H) |
+=====+==========+
| H_0 |   0.0000 |
+-----+----------+
| H_1 |   0.5000 |
+-----+----------+
| H_2 |   0.5000 |
+-----+----------+
In:
posterior_c = infer.query(['C'], evidence={'P': 0, 'H': 2})
print(posterior_c['C'])
+-----+----------+
| C   |   phi(C) |
+=====+==========+
| C_0 |   0.3333 |
+-----+----------+
| C_1 |   0.6667 |
+-----+----------+
| C_2 |   0.0000 |
+-----+----------+
In:
posterior_c = infer.query(['C'], evidence={'P': 1, 'H': 2})
print(posterior_c['C'])
+-----+----------+
| C   |   phi(C) |
+=====+==========+
| C_0 |   0.6667 |
+-----+----------+
| C_1 |   0.3333 |
+-----+----------+
| C_2 |   0.0000 |
+-----+----------+

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!