본문 바로가기
Python과 확률

조건부 확률부터 마르코프까지 - 2) 베이즈 정리

by Yoo Sung Hyun 2021. 12. 16.
728x90

2021.12.14 - [Python과 확률] - 조건부 확률부터 마르코프까지 - 1) 조건부 확률과 독립 사건

 

조건부 확률부터 마르코프까지 - 1) 조건부 확률과 독립 사건

조건부 확률. 쉽고도 어렵다. 명확한 사건과 조건, 그리고 적은 상태와 그의 이행은 사실 손으로도 계산 해봄직 하다. 하지만, 현실은 그렇게 녹록지는 않은 법. 많아지면 손으로 하기는 엄두도

shyu0522.tistory.com

여기서 이어집니다.

 

이전에 조건부 확률과 독립, 종속 사건에 대해서 알아보았다.

 

조건부 확률을 통해, 마치, 사칙연산의 규칙처럼, 확률도 구하기 위한 각종 변형법이 존재하고, 연산의 규칙이 있다는 것을 알 수 있다.

그러면 이제 베이즈 정리를 이해할 수 있게 된 셈인데, 베이즈 정리는 한마디로는 이렇다.

P(A|B)를 알고있다면, P(B|A)도 확률의 연산규칙에 의해 구할 수 있다.

코로나 검사에 양성이었을때, 병에 걸려있을 확률을 안다면,

병에 걸렸을때, 코로나 검사가 양성이 뜰 확률을 구할 수 있는 것이다.

코로나 검사지가 100%의 적중율을 보인다면, 위의 과정은 사실상 첫번째 조건부확률에서 병에 걸려있을 확률이 100%가 되니 무의미해지지만, 코로나 검사지의 적중율이 조금이라도 차이가 난다면...? (병에 걸렸지만 음성이 뜰 수도 있다?)

 

잠깐은 어떻게 구해야될지 생각해보게 될 것이다. (뭐 물론 조건부 서식을 이용한 베이즈 정리도, 몇 가지 확률적 변수들이 필요하긴 하다.)

 

베이즈 정리는 사실 문제에서, 어떤 확률 변수들을 먼저 알려줄지 모르므로, 최대한 많은 종류의 확률 연산 규칙을 알고 있는 것이 중요하겠다. 일단 근간은 이러하다.

출처 https://datascienceschool.net/02%20mathematics/06.06%20%EB%B2%A0%EC%9D%B4%EC%A6%88%20%EC%A0%95%EB%A6%AC.html

통상 사전확률과 정규화상수는 구할 수 있게 주어주며, 사후확률도 구하거나, 주어진 상태로 가능도를 구하는 문제가 많다.

P(A|B)는 실제로 그냥 문제에서 주어진 개수를 활용하여 구할 수도 있으며, 승법정리를 이용하여, P(A∩B) = P(A)P(B|A) = P(B)P(A|B) 로 구할 수도 있겠고,

또 P(A∩B)는 곱사상으로 그냥 곱해서 계산되므로, P(A) * P(B)로 계산될 수도 있으며, P(A^c)를 이용해서 구할 수도 있겠고, 주어지는 확률이 어떤 것들이 있냐에 따라서 구할 수 있는 방법이 상당히 많다.

 

그래서 약간은 사상을 이해하고, 많은 연산규칙을 고려하여 본인이 얻어낼 수 있는 Data를 이용, 계산하여 구하면 그만인 문제다. (때문에 파이썬으로 뭔가 정규화된 소스를 짜기는 상황마다 다를 것이므로 조금 어렵다.)

사상은, B가 발생했을때 A가 발생할 확률은, 결국 B가 발생할 확률중에, A와 B가 동시에 발생할 확률을 구하면 되는 것이다. (확률에 기본인 '구하고자하는 확률의 경우의 수 / 전체 경우의 수'의 문제에서 크게 벗어나지 않는다는 점!)

 

그리고 조금 응용한다면,

이와 같은 내용들도 있는데, 여러가지 보기중에서의 각 확률을 구하는 문제로, 결국 가장 높은 확률을 가지는 값을 고르면, 분류문제를 해결할 수도 있다는 이야기다.

이것도 식만 복잡하지 말로 풀어보면,

B상황에서 특정 An이 발생할 확률 = B상황에서 An이 발생할 확률/B상황에서 전체 An이 발생할 확률

상황을 B로 제한해놓고, 그 안에서 나올 경우의 수를 확률로 변환해주면 된다는 점이다.

 

아이디어 출처(https://gomguard.tistory.com/69)

'''
사전확률(P(A)) : 사전에 알고 있는 확률
정규화 상수 (P(B)) : 사전에 알고 있는 수
사후확률(P(A|B)) : 내가 알고자 하는, 아직 모르는 확률
가능도(P(B|A)) : 사전에 경험상 대략 알고 있는 확률

부분적 확률만 알고 있을때, 어떤 특정 조건부 확률을 구해낸다.
'''

is_rain = {'sunny':{True:2,False:8},'cloudy':{True:5,False:5}}

# task 1. 맑은날 비가 왔을 확률
# P(is_rain_true|sunny) = p(sunny|is_rain_true) * p(is_rain_true) / p(sunny)
p_sunny = (is_rain['sunny'][True]+is_rain['sunny'][False])/(is_rain['sunny'][True]+is_rain['cloudy'][True]+is_rain['cloudy'][False]+is_rain['sunny'][False])
p_is_rain_true = (is_rain['sunny'][True]+is_rain['cloudy'][True])/(is_rain['sunny'][True]+is_rain['cloudy'][True]+is_rain['cloudy'][False]+is_rain['sunny'][False])
p_sunny_cond_is_rain_true = (is_rain['sunny'][True])/(is_rain['sunny'][True]+is_rain['cloudy'][True])

p_is_rain_true_cond_sunny = (p_sunny_cond_is_rain_true*p_is_rain_true)/p_sunny
print(p_is_rain_true_cond_sunny)

맥락만을 이해하기 위해서는 전체 경우의 수 테이블(is_rain)을 주어주고, 확률을 구해보면 되는데,

P(비옴|맑음)은 베이즈 정리를 통해 p_is_rain_true_cond_sunny로 구해볼 수도 있겠지만은,

그냥 테이블에서, 맑았을때 비옴 (전체에서의 상황) /맑음 (전체)의 숫자 덧셈 및 나눗셈으로 충분히 구해볼 수 있다.

(또 그렇게 하면서 이해하라고 문제를 이렇게 주어준 것도 있는 것 같고.)

결과적으로 베이즈 정리로 구한 값과, 실제로 값으로 구한 값은 동일함을 알 수 있다. (정답은 20%)

 

함수화해서 git에 올려놓으려고 생각을 좀 많이 했는데, 예제 상황들을 보니, 뭐 다 주어주는 경우도 있고, 교집합 주어주는 경우도 있고, 막 최악의 경우에는 확률의 역까지 계산해서 구해야되는 케이스들도 존재해서, 뭔가 템플릿화 시키긴 어렵다는 생각이 든다.

 

일단은 개념만 이해하고, 사상을 활용할 준비(부분적인 확률값들로, 어떤 조건에서의 확률을 구할라면 베이즈 정리를 써야겠다..!) 정도만 마친 상태로, 나이브 베이즈 분류로 넘어가도록 하자.

알고리즘 코테 준비하면서도 느껴지는 점이지만, 이런 사상이나 연산방식은 최대한 많은 문제들을 다뤄보고 적용해보면서 감을 익히고 사용하는게 중요하더라....

 

ETC

출처 : https://wikidocs.net/122767

한마디로 깔끔하게 잘 정리된 내용

728x90

댓글