결합확률
정의 :
사건 A와 사건 B가 동시에 발생하는 사건의 확률. (A,B 교집합의 확률)
$=$ $P(A,B)$
- 사건 A의 원소와 사건 B의 원소로 구성된 벡터의 확률이기도 하다.
- 2차원 벡터들의 결합확률분포는 3차원 모양 함수로 표현된다.
주변확률
정의 :
개별 사건 A,B의 확률.
$= P(A), P(B)$
- X,Y 확률변수의 결합확률분포함수에서, X의 주변확률분포는 각 X값에 대한 모든 Y값을 더한 값들의 분포다.
조건부확률
정의 :
사건 B를 새 전체집합으로 삼았을 때, 사건 A의 확률
또는
조건 B가 있을 때, A의 확률.
$= P(A\vert{B})$
- 조건부확률분포는 특정 값에서의 결합확률분포 단면을 특정 값에서의 주변확률분포값 으로 나눈 값들의 분포다.
예) $P(X\vert{Y=3}) = \frac{P(X, Y=3)}{P(Y=3)}$
사건의 독립 (두 사건이 서로 영향 미치지 않는다)
사건 A,B 사이에 다음 관계가 성립하면, ‘사건 A,B는 서로 독립이다’ 라고 한다.
$P(A,B) = P(A)P(B)$
- 사건 A,B가 독립이면 조건부확률이 원래 확률과 같아진다.
$P(A\vert{B}) = P(A)$
즉, 사건 B가 사건 A 확률값에 아무 영향 못 미친다는 뜻이다.
사슬법칙
정의 :
결합확률과 조건부확률 사이 관계를 나타내는 법칙이다.
$P(A,B,C,D) = P(A\vert{B,C,D})P(B\vert{C,D})P(C\vert{D})P(D)$
- 다양한 곳에서 응용이 가능한, 매우 유용한 법칙이다.
사건 A,B,C,D가 서로 독립이면, 다음이 성립한다.
$P(A,B,C,D) = P(A)P(B)P(C)P(D)$
피지엠파이 패키지로 확률모형 시각화 하기
pgmpy 패키지를 사용하면 확률모형을 시각화 할 수 있다.
- 결합확률모형 시각화 하기
pgmpy 패키지의 JointProbabilityDistribution 클래스를 사용하면, 결합확률모형을 시각화 할 수 있다.
1
2
3
from pgmpy.factors.discrete import JointProbabilityDistribution as JPD
px = JPD(variables, cardinality, values)
- variables : 결합확률분포 모형 구성하는 확률변수들 이름 ‘리스트’ 넣는다.
- cardinality : 각 확률변수 가능한 표본 수를 ‘리스트’ 형식으로 넣는다.
- values : 확률변수의 모든 표본 조합에 대한 (결합)확률값의 배열
결합확률모형 시각화 예)
1
2
3
4
5
6
7
8
# 확률변수 X,Y의 주변확률분포 시각화 하기
from pgmpy.factors.discrete import JointProbabilityDistribution as JPD
px = JPD(['X'], [2], np.array([12,8])/20)
print(px)
py = JPD(['Y'], [2], np.array([5,5])/10)
print(py)
1
2
3
# X,Y 확률변수의 결합확률분포 시각화
pxy = JPD(['X','Y'], [2,2], np.array([3,9,7,1])/20)
print(pxy)
- 결합확률분포에서 주변확률분포, 조건부확률분포 구해서 시각화 하기
- X의 주변확률분포는 X 각 점을 기준으로 Y와의 가능한 모든 결합확률을 더한 값들의 분포다.
- X의 조건부확률분포는 Y값 고정한 결합확률분포 단면 / 고정한 Y값에서의 주변확률분포값 의 분포다.
사용하는 메서드
주변확률분포 구하는 메서드
- marginal_distribution(‘주변확률분포 구할 확률변수 이름 리스트’, inplace=JPD 객체를 주변확률분포 객체로 대체할 지 말지 입력)
- maginalize(‘주변화시킬(제거할) 확률변수 이름 리스트’, inplace=)
조건부확률분포 구하는 메서드
- conditional_distribution(values, inplace=)
values : 조건으로 삼을 확률변수 이름과 고정할 값 튜플로 묶은 것들의 리스트
- 결합확률분포에서 두 확률변수가 서로 독립인지 확인하기
- check_independence([‘확률변수 1 이름’],[‘확률변수 2 이름’])
사용 예)
1
2
3
# 확률변수 X,Y의 결합확률분포 객체 정의
pxy2 = JPD(['X','Y'], [2,2], np.array([3,3,2,2])/10)
print(pxy2)
1
2
3
4
# 결합확률분포의 두 확률변수 X,Y가 서로 독립인가?
print(pxy2)
ind = pxy2.check_independence(['X'],['Y'])
print(f'확률변수 X,Y 는 서로 독립인가? : {ind}') # 확률변수 X,Y는 서로 독립이다.
True
X,Y 확률변수는 서로 독립이다.
1
2
3
# x=0 일 때 Y의 조건부확률분포
print('X=0 일 때 Y의 조건부확률분포')
print(pxy2.conditional_distribution([('X',0)], inplace=False)) # X = 0 일 때 Y의 조건부확률분포
1
2
3
4
# x=1 일 때 Y의 조건부확률분포
print('X=1 일 때 Y의 조건부확률분포')
print(pxy2.conditional_distribution([('X',1)], inplace=False)) # X = 1 일 때 Y의 조건부확률분포
print()
1
2
3
4
# Y의 주변확률분포
print('Y의 주변확률분포')
print(pxy2.marginal_distribution(['Y'], inplace=False))
print()
1
2
3
# Y=0 일 때 X의 조건부확률분포
print('Y=0 일 때 X의 조건부확률분포')
print(pxy2.conditional_distribution([('Y',0)], inplace=False))
1
2
3
4
# Y=1 일 때 X의 조건부확률분포
print('Y=1 일 때 X의 조건부확률분포')
print(pxy2.conditional_distribution([('Y',1)], inplace=False))
print()
1
2
3
4
# X의 주변확률분포
print('X의 주변확률분포')
print(pxy2.marginal_distribution(['X'], inplace=False))
print()
marginalize()를 사용하는 경우
1
2
3
# Y를 주변화하고 X의 주변확률분포 구하기
py = pxy2.marginalize(['Y'], inplace=False) # X의 주변확률분포
print(py)
1
2
3
# X를 주변화 하고 Y의 주변확률분포 구하기
px = pxy2.marginalize(['X'], inplace=False) # Y의 주변확률분포
print(px)
베이즈 정리
정의 :
사건 B라는 새로운 정보가 추가로 들어왔을 때, 사건 A의 사전확률이 어떻게 바뀌는가?(사건 A의 사후확률)
$P(A\vert{B}) = \frac{P(B\vert{A})P(A)}{P(B)}$
조건부확률의 응용버전.
- $P(B\vert{A}) =$ 가능도
- $P(A)=$ 사전확률
- $P(A\vert{B})=$ 사후확률
- $P(B) =$ 정규화 상수 (중요도 낮음. 크기 조절 역할만 한다)
베이즈 정리의 확장 1
사건 $A_{i}$ 가
- $A_{i}\cap{A_{j}}= \varnothing$
- $A_{1}\cup{A_{2}}…\cup{A_{n}} = \Omega$
일 때 전체확률의 법칙을 베이즈정리에 적용할 수 있다.
사건 B가 표본공간 $\Omega$ 의 또 다른 부분집합일 때,
$P(A_{i}\vert{B})$
$= \frac{P(B\vert{A_{i}})P(A_{i})}{P(B)}$
$= \frac{P(B\vert{A_{i}})P(A_{i})}{\sum{P(B\cap{A_{i}})}}$
$= \frac{P(B\vert{A_{i}})P(A_{i})}{\sum{P(B\vert{A_{i}})P(A_{i})}}$
가 성립한다.
위 식은 ‘다중분류 문제’에서 확용할 수 있다.
다중분류 문제
여러 배타적이고 완전한 사건 중에서 가장 확률이 높은 사건 하나를 고르는 문제가 ‘다중분류 문제’다.
정답이 무조건 하나인 4지 선다형 객관식 문제를 푼다고 생각해보자. 정답이 될 수 있는 보기는 1,2,3,4 이다.
‘정답’ 확률변수의 가능한 4개 표본(1,2,3,4) 하나하나를 그 표본으로만 구성된 단순사건이라 생각하자.
그리고
$A_{1} = [1]$
$A_{2} = [2]$
$A_{3} = [3]$
$A_{4} = [4]$
로 생각하자.
$A_{1}$ ~ $A_{n}$ 의 사건은 각각 1,2,3,4 가 정답인 사건이다.
문제의 가능한 정답은 무조건 1,2,3,4 중에 있다. 따라서 $A_{1}$ ~ $A_{n}$ 사건의 합집합은 전체 표본공간을 구성한다.
$\Rightarrow$ $A_{1}\cup{A_{2}}\cup{A_{3}}\cup{A_{4}} = \Omega$
그리고 각 단순사건은 교집합이 공집합이다.
$\Rightarrow$ $A_{1}\cap{A_{2}}\cap{A_{3}}\cap{A_{4}} = \varnothing$
이때, 선생님께서 정답에 대한 힌트를 주셨다고 하자. 힌트에 대한 사건을 B 라고 하자. B는 표본공간 $\Omega$ 의 또 다른 부분집합이다.
보기 1,2,3,4 중에서 주어진 힌트와 가장 비슷한 보기가 정답일 확률이 가장 높을 것이다.
그러면 힌트가 주어졌을 때, 1,2,3,4 각각이 정답인 사건의 확률을 구해보자.
$P(A_{1}\vert{B}) = P(B\vert{A_{1}})P(A_{1})$
$P(A_{2}\vert{B}) = P(B\vert{A_{2}})P(A_{2})$
$P(A_{3}\vert{B}) = P(B\vert{A_{3}})P(A_{3})$
$P(A_{4}\vert{B}) = P(B\vert{A_{4}})P(A_{4})$
분모는 모두 같아서 생략했다.
$A_{1}, A_{2}, A_{3}, A_{4}$ 는 서로 배타적이며, 이들은 완전하다.
이 문제는 힌트 B가 주어졌을 때, 서로 배타적이고 완전한 $A_{i}$ 중 확률이 가장 높은 $A_{i}$ 를 고르는 문제다.
= 다중분류 문제다.
이 다중분류 문제의 ‘정답’은 위 조건부확률값이 가장 큰 $A_{i}$ 로 분류된다.
이진분류 문제
만약 정답이 두 개의 서로 배타적이고 완전한 사건 중 확률값 더 높은 걸로 분류된다면, 이진분류 문제라고 한다.
$A \cup{A^{C}} = \Omega$
$A \cap{A^{C}} = \varnothing$
$\Rightarrow$ 정답이 $A$ 또는 $A^{C}$ 로 분류된다면 ‘이진분류 문제’다.
위 문제를 이진분류 문제로 바꾸면,
$P(A\vert{B}) = P(B\vert{A})P(A)$
$P(A^{C}\vert{B}) = P(B\vert{A^{C}})P(A^{C})$
힌트 B가 있을 때 $A$ 또는 $A^{C}$ 중에 확률값이 더 높은걸로 ‘정답’을 분류하면 된다.
곧, 위 조건부확률값이 더 큰 사건($A$ or $A^{C}$) 으로 ‘정답’을 분류하면 된다.
베이즈 정리의 확장 2
A에 추가 정보 B가 반영되고 나서 또다시 C가 반영되는 경우, A 사후확률은 다음과 같이 계산할 수 있다.
$P(A\vert{B,C}) = \frac{P(C\vert{A,B})P(A\vert{B})}{P(C\vert{B})}$
또는 추가 정보 C가 반영되고 나서 또다시 B가 반영되는 경우, A 사후확률은 다음과 같다.
$P(A\vert{B,C}) = \frac{P(B\vert{A,C})P(A\vert{C})}{P(B\vert{C})}$
증명은 결합확률과 조건부확률사이 사슬법칙을 사용해서 할 수 있다.
$\Leftarrow P(A,B,C) = P(A\vert{B,C})P(B\vert{C})P(C)$
다양한 사전확률에 대해 사후확률 계산할 수 있다는 게 핵심 포인트다.
몬티 홀 문제. 다중분류 문제로 풀기
몬티홀 문제를 다중분류 문제로 풀어보자.
내가 분류하고자 하는 건 ‘자동차의 위치’다.
자동차의 위치 확률변수를 $C$ 라 하자.
자동차의 위치는 0번 문, 1번 문, 2번 문 셋 중에 있다.
자동차가 0번 문에 있는 사건을 $C_{0} (C=0)$
자동차가 1번 문에 있는 사건을 $C_{1} (C=1)$
자동차가 2번 문에 있는 사건을 $C_{2} (C=2)$
이라고 하자.
$C_{0},C_{1},C_{2}$ 은 서로 배타적이고(교집합이 공집합), 완전하다(세 집합 합집합은 전체집합 $\Omega$ 다).
자동차의 위치는 $C_{0}, C_{1}, C_{2}$ 셋 중 하나로 분류되므로, ‘다중분류 문제’로 풀 수 있다.
한편, ‘내가 선택한 문’ 확률변수를 $X$ 라고 하자.
$X$ 가 가질 수 있는 표본도 0,1,2 이다.
‘사회자가 선택한 문’ 확률변수를 $H$ 라 하자.
$H$ 가 가질 수 있는 표본도 0,1,2 이다.
맨 처음에 자동차가 0,1,2 각각에 있을 수 있는 확률은
$P(C_{0}) = \frac{1}{3}$
$P(C_{1}) = \frac{1}{3}$
$P(C_{2}) = \frac{1}{3}$
이다.
게임을 하면서 내가 문을 하나 선택하고, 사회자가 문을 선택해서 염소를 보여줄 것이다.
내가 문을 고르고, 사회자가 염소를 보여줬을 때, $C_{0}, C_{1}, C_{2}$ 의 확률이 각각 얼마가 될 지 보자.
$\Rightarrow$ $P(C_{i} \vert{H_{j}, X_{a}})$
예를 들어 내가 2번문을 골랐다. 사회자가 1번문을 열어 염소를 보여줬다. 이때 0,1,2 번 문 각각에 자동차가 있을 확률은 얼마일까?
자동차가 0번 문에 있을 확률)
$P(C_{0}\vert{H_{1}, X_{2}}) = \frac{2}{3}$
자동차가 1번 문에 있을 확률)
사회자가 1번문을 열여서 염소가 있다는 걸 보여줬기 때문에, 1번 문 뒤에 자동차가 있을 수. 없다.
$P(C_{1}\vert{H_{1}, X_{2}}) = 0$
자동차가 2번 문에 있을 확률)
$C_{0} \cup C_{1} \cup C_{2} = \Omega$ 였다. 또, $C_{0} \cap C_{1} \cap C_{2} = \varnothing$ 이었다.
따라서 $P(C_{0})+P(C_{1})+P(C_{2}) = 1$ 이다.
조건부확률일 때도 똑같이 성립한다. 따라서, $1-\frac{2}{3} = \frac{1}{3}$ 이다.
$P(C_{2}\vert{H_{1}, X_{2}}) = \frac{1}{3}$
결론 1 : 다중분류 문제 정의에 충실하게
다중분류 문제에서, ‘자동차의 위치’는 $C_{0}, C_{1}, C_{2}$ 중에서 가장 확률값이 큰 사건으로 분류된다.
세 조건부확률 중 $P(C_{0}\vert{H_{1}, X_{2}})$ 의 확률값이 가장 크다.
따라서 ‘자동차의 위치’는 $C_{0} =$ ‘0번 문 뒤에 자동차가 있다’ 로 분류된다.
내가 처음 선택했던 문은 1번 문 이었다. 다중분류 문제 분류 결과, 1번 문 뒤에는 자동차가 없었다.
분류결과에 따르면 자동차가 있는 것은 0번 문이었다. 따라서 자동차가 당첨되기 위해서는 1번 문에서 0번 문으로 ‘선택을 바꿔야 한다’.
결론 2 : 단순 확률값 비교해서
위 세개 조건부 확률은 각각 최종으로 0번문, 1번문, 2번문 뒤에 자동차가 있을 확률이다.
내가 선택했던 문은 1번 문이었다. 1번문의 확률값은 $\frac{1}{3}$ 이었다.
한편, 0번 문에 자동차가 있을 확률은 $\frac{2}{3}$ 이었다.
0번 문에 자동차가 있을 확률이 더 높으므로, 나는 ‘선택을 바꾸는 것이 자동차 당첨에 유리하다’.
몬티 홀 문제를 pgmpy 베이지안 모형으로 풀어보자.
몬티 홀 문제를 pgmpy 베이지안 모형 이용해서 풀어보자.
내가 선택을 바꿀 지, 바꾸지 말 지 결정하기 위해 필요한 확률값은 다음 세 가지다.
$P(C_{0}\vert{H_{1}, X_{2}})$
$P(C_{1}\vert{H_{1}, X_{2}})$
$P(C_{2}\vert{H_{1}, X_{2}})$
이 세 가지 확률을 베이지안 모형 패키지 사용해서 구하자.
사전확률을 정의하자
먼저 사전확률을 정의해야 한다.
사전확률은 자동차의 위치 $C_{0}, C_{1}, C_{2}$ 의 확률이다.
사전확률 값이 모두 $\frac{1}{3}$ 이다.
이제 피지엠파이 TabularCPD 클래스에 위 값들을 넣고, 사전확률 객체를 정의하자.
1
2
3
4
5
6
from pgmpy.factors.discrete import TabularCPD
# 사전확률 정의하자
pre = TabularCPD('C', 3, np.array([[1/3],[1/3],[1/3]]))
print('사전확률')
print(pre)
가능한 모든 가능도를 정의하자.
사전확률을 정의했다. 그러면 이제 모든 조건에 대해 가능한 모든 가능도를 정의하자.
$P(H,X\vert{C})$ 에 대해 가능한 모든 경우를 정의할 것이다.
결합사건 (H,X) 는 하나의 문자 G 로 통일했다.
$\Rightarrow$ $P(G\vert{C})$
$C$ 를 이용해 정의할 수 있는 가능한 모든 조건은 $C_{0},C_{1}, C_{2}$ 이다.
각각의 $C_{i}$ 에 대해 $G$ 는 총 9가지 조건이 가능하다. $(H_{0}X_{0}, H_{1}X_{1},….H_{2}X_{2})$
이걸 생각하면서 가능도 객체를 정의하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 가능한 모든 가능도 정의
values = np.array([
[0,0,0],
[0,1/6, 1/3],
[0,1/3, 1/6],
[1/6, 0, 1/3],
[0,0,0],
[1/3, 0, 1/6],
[1/6, 1/3, 0],
[1/3, 1/6, 0],
[0,0,0]
])
likelihood = TabularCPD('G', 9, values, evidence=['C'], evidence_card=[3])
print('가능도')
print(likelihood)
print()
위에서 ndarray 객체 values 는 각 경우에 대해 직접 수기계산해서 확률값을 넣었다.
정의된 가능도 객체는 위 이미지와 같다.
$G$ 는 결합사건 $(H_{i},X_{j})$ 을 의미한다.
베이지안 모형 만들기
이제 그러면 베이지안 모형 객체를 생성하고, 앞에서 만든 사전확률과 가능도 객체를 넣어주자.
1
2
3
4
5
6
# 베이지안 모형 만들기
from pgmpy.models import BayesianModel
model = BayesianModel([('C','G')]) # 확률변수 이름 순서도 중요하다.
model.add_cpds(pre, likelihood) # 사전확률, 가능도 객체 투입!
model.check_model() # 모델이 정상으로 생성되었는지 점검
True
모델이 정상으로 생성되었다.
이제 추정 객체를 사용해서, 내가 알고싶은 위 조건부 확률(C의 사후확률) 3개를 구하자.
1
2
3
4
5
6
# 베이지안 모형 이용해서 조건부확률 계산
from pgmpy.inference import VariableElimination
infer = VariableElimination(model) # 추정객체
post = infer.query(['C'], evidence={'G': 5}) # G = 5 일 때(H1,X2), C에 대한 사후확률 계산
print(post)
위에서 부터 차례로
$P(C_{0}\vert{H_{1}, X_{2}})$
$P(C_{1}\vert{H_{1}, X_{2}})$
$P(C_{2}\vert{H_{1}, X_{2}})$
이다.
내가 선택한 2번 문 뒤에 자동차가 있을 확률은 0.33 이고, 남은 0번 문 뒤에 자동차가 있을 확률은 0.666 이다.
따라서 선택을 바꾸는 게 ‘자동차 당첨에 유리하다’.