교재링크(광고 아님): freelec.co.kr/book/인공지능을-위한-수학/

 

 

결합확률(joint probability)

사건 두 개가 함께 일어날 확률. 동시도 가능하고 연속도 가능하다. 예를 들어 주사위 두개를 동시에 굴리면 동시에 나오는 것이고, 한개를 두번 굴리면 연속으로 나오는 것이다. 기호로는 아래와 같이 표현한다.

$$ P(A \mbox{ and } B) = P(A \cap B) $$

읽는 방법은

  • A and B
  • intersection of A and B
  • joint probabilty of A and B

 

만약 두 사건이 서로 독립적이라면 아래와 같은 수식 표현이 가능하다.

$$ P(A \cap B) = P(A) \cdot P(B) $$

 

독립적인 경우라 함은 두 사건이 서로 연관성이 없어야 한다는 의미인데, 예를 들어 주사위 한개를 두 번 던졌을 때, 3(사건 A), 6(사건 B)이 순서대로 나올 확률 같은 경우이다. 첫 번째 던졌을 때 3이 나온 다음, 두 번째 던졌을 때 6만 나오면 되므로, 아래와 같이 확률을 구할 수 있다.

$$ P(A \cap B) = P(A) \cdot P(B) = \frac{1}{6} \times \frac{1}{6} = \frac{1}{36} $$

 

하지만, 아래와 같은 경우에는 서로 연관이 되어 있는 조건이므로 위의 공식은 성립하지 않고, 독립 사건으로 바꾸거나 조건부 확률을 이용하거나 해야 한다.

  • 주사위를 두 번 던져서 순서에 관계없이 3과 6이 나올 확률
  • 주사위를 두 번 던졌을 때, 두 눈의 합이 5를 넘지 않고 첫번째 눈이 3인 경우.
  • ...

 

 

조건부확률(conditional probability)

사건 B가 일어난 상태에서 사건 A가 일어날 확률. 아래와 같이 수식으로 정의할 수 있다.

$$ P(A \mbox{ | } B) = \frac { P(A \cap B) }{ P(B) } $$

A와 B의 순서가 바뀌면 수식도 바뀌게 된다. 확률 통계 특성 상 완전한 공식은 아니고, 어떻게 사건을 설정하느냐에 따라 전혀 다르게 확률을 구해야 할 수 있다.

 

참고로... 만약 두 사건이 서로 독립적이라면 수식이 간단히 정리된다.

$$ P(A \mbox{ | } B) = \frac { P(A \cap B) }{ P(B) } = \frac { P(A)P(B) }{ P(B) } = P(A) $$

하지만, 실제 문제 해결 시 이런 심플한 경우는 별로 없는 것 같았다. (이렇게 심플하면 조건부 확률 자체가 필요 없을 듯...)

 

교재에 조건부확률에 대한 예로 질병 판정률을 구하는 예제가 있었다. 대략 요약하면 아래와 같은 문제인데,

  • A 질병이 걸릴 확률은 0.0005% (백만명 당 5명)
  • A 질병검사의 정확도는 99.99%
  • 무작위 검사에서 양성이 나올 경우 진짜 병에 걸린 사람의 비율은?

답은 대략 4.76% 였다.

 

정말 이게 맞는지 알아보기 위해 C 코드로 한번 구현해 보았다. 코드는 아래와 같다.

#include <iostream>
#include <stdlib.h>
#include <time.h>

#define RANDOM(__min__, __max__) \
	((int)(((double)((rand()<<15) | rand())) / ((RAND_MAX<<15 | RAND_MAX) + 1) \
	* ((__max__) - (__min__))) + (__min__))

int main()
{
	srand((unsigned int)time(nullptr));

	int all_positive_cnt = 0;
	int true_positive_cnt = 0;

	for(int tot = 0; tot < 1000; tot++)
	{
		for(int t = 0; t < 1000000; t++)
		{
			bool disease_flag = RANDOM(0, 1000000) < 5;
			bool correct_flag = RANDOM(0, 10000) > 0;
			bool true_positive_flag = disease_flag && correct_flag;
			bool false_positive_flag = !disease_flag && !correct_flag;

			if(true_positive_flag || false_positive_flag) all_positive_cnt++;
			if(true_positive_flag) true_positive_cnt++;
		}
	}

	std::cout << true_positive_cnt << "/" << all_positive_cnt << " = "
		<< ((double)true_positive_cnt / all_positive_cnt) * 100 << "%"
		<< std::endl;
}

 

코드를 간단히 설명하자면 백만명 검사 세트를 1,000번 돌려서 전체 양성탐지회수 대비 진짜 유병회수를 구하는 것이다.

랜덤함수는 내 블로그의 내용을 가져다 썼다.

결과는 아래와 같다.

 

콘솔 로그를 캡쳐함

 

몇번 더 돌려보아도 대략 5%의 확률이 나왔다. 교재의 확률과 비슷하기는 하지만, 0.3%가 작은 차이는 아닐진데... 코드의 어디가 잘못되었는지 도무지 알 수가 없어 대략 비슷하다 느낌으로 끝맺을까 한다.

 

첨언하자면, 이 섹션을 공부하면서... 아직 인공지능을 잘 모르지만, 내가 위에 코딩한 것과 비슷한 느낌이 아닐까 했다. 계산으로 구하기 어려운 문제에 대해 간단한 코드를 만들어 이를 무한에 가깝게 돌려서 어떤 확률로 정리하는 것이다. 교재의 예제야 어찌어찌 수식으로 만들어서 근사(近似)하게 구할 수도 있겠지만, 인공지능이 정복하고자 하는 세계는 시체말로 혼돈의 카오스이기 때문에 이런 단순한 접근이 오히려 가장 정확할 수 있겠다는 생각이 어렴풋이 들었다.

 

Posted by JMAN