몬테카를로(Monte-Carlo) 시뮬레이션에 대한 이론적인 설명
1. 목표
직사각형 안에 어떤 도형을 그려놓자.
빨간색 영역의 넓이는 얼마인지 알고 싶다.
2. 기본적인 원리
만약, 위와 같은 직사각형에서 임의의 난수를 하나 뽑는다고 하자.
그 난수가 빨간색 영역인 HIT에 들어갈 확률은 얼마인가?
직사각형의 넓이는 $c(b-a)$이고
빨간색 영역의 넓이를 $S$라고 하면, 기하학적 확률의 원리에 의해 $$p= \frac{(난수가 \; 목표로 \; 하는 \; 빨간색 \; 영역의 \; 넓이)}{(난수가 \; 있을 \; 수 \; 있는 \; 전체 \; 영역의 \; 넓이)} = \frac{S}{c(b-a)}$$
그러나 $S$를 모른다는 것이 중요하다. 즉 우리는 p값도 알 수가 없다
그런데 $p$값을 다른 방법으로 추정해볼 수 있는데
위와 같은 직사각형 위에서 $N$개의 난수를 뽑는다고 하자.
각 난수가 HIT영역에 들어갈 확률은 위에서 구한대로 $p$이고 MISS영역에 들어갈 확률은 $1-p$
컴퓨터로 $N$개의 난수를 생성했을 때 HIT영역에 들어간 난수의 수를 (셀 수 있다면) $N _{H}$라고 하자.
경험적으로 우리는 난수가 HIT영역에 들어갈 확률이 $\frac{N _{H}}{N}$
그렇다면 대수의 법칙(The law of large number)에 의해 경험적확률은 시도 횟수 $N$이 무수히 많아지면 수학적 확률 $p$에 수렴하므로 $$\lim _{N-> \infty } \frac{N _{H}}{N} =p$$
이 사실은 $N$을 충분히 크게하면 $p$의 추정값으로 $\frac{N _{H}}{N}$를 쓸 수 있다는 것을 알려준다.
그런데 $p= \frac{S}{c(b-a)}$이므로 $${\hat{p}} = \frac{N _{H}}{N} \approx \frac{S}{c(b-a)}$$
따라서 우리는 빨간색 영역의 넓이 $S$를 다음과 같이 추정할 수 있다.
$$S \approx \frac{N _{H}}{N} c(b-a)= {\hat{S}}$$
3. 추정량과 추정치
시뮬레이션은 난수를 뽑아서 이루어지기 때문에 사람마다 다른 결과를 얻는다는 점이 중요하다.
실험을 한번 수행하면 얻는 $$\frac{N _{H}}{N} c(b-a)= {\hat{S}}$$와 $$\frac{N _{H}}{N} = {\hat{p}}$$은 사람마다 다르다.
쉽게 말해 100명의 사람이 위와 같은 실험으로 구해보면
$${\hat{S}} _{1} , {\hat{S}} _{2} , {\hat{S}} _{3} , {\hat{S}} _{4} , {\hat{S}} _{5} ,..., {\hat{S}} _{100}$$을 얻는다.
근데 서로 다른 이 값 모두 실제 값 $S$에 근사하므로 추정치로 사용할 수 있다.
즉 $\frac{N _{H}}{N} c(b-a)= {\hat{S}}$은 하나의 랜덤값이다.
이것을 $S$의 추정량(estimator)이라 부르고 하나의 확률분포를 갖는 확률변수가 된다.
그리고 어느 한사람이 실험을 통해 계산하여 얻은 하나의 실현값 ${\hat{S}} _{1}$은 추정치(estimate)
${\hat{S}} _{1} , {\hat{S}} _{2} , {\hat{S}} _{3} , {\hat{S}} _{4} , {\hat{S}} _{5} ,..., {\hat{S}} _{100}$은 바로 확률변수 $\frac{N _{H}}{N} c(b-a)= {\hat{S}}$의 분포에 따라 랜덤하게 분포한다
4. $\hat{S}$의 확률분포
$\hat{S}$의 확률분포는 확률변수 $\frac{N_{H}}{N} = \hat{p}$에 의해 결정된다.
여기서 N은 일정하므로, $N_{H}$가 확률변수이다.
$N_{H}$는 N개의 난수 중 HIT에 들어간 난수의 개수이다.
난수 1개를 뽑는 것이 하나의 사건이고, HIT를 하나의 성공, MISS를 하나의 실패라고 한다면,
$N_{H}$는 N번 일어난 사건 중에서 $N_{H}$번 성공이 일어나는 경우로 이항분포(binomial distribution)를 따른다.
난수가 HIT에 들어갈 확률, 성공확률은 p이므로 $N_{H} ~ B(N,p)$
그러므로 N이 충분히 크면 $\frac{N_{H}}{N}$은 평균이 p이고 분산이 p(1-p)/n인 정규분포를 따른다.
5. 몬테카를로 시뮬레이션
확률변수 $\frac{N _{H}}{N} c(b-a)= {\hat{S}}$의 기댓값은 $$E( {\hat{S}} )=E( {\hat{p}} c(b-a))=pc(b-a)=S$$
대수의 법칙(The law of Large number)에 의해 기댓값은 표본평균에 수렴한다.
무슨 말이냐면 $\frac{N _{H}}{N} c(b-a)= {\hat{S}}$에서
랜덤하게 실현한 추정치 ${\hat{S}} _{1} , {\hat{S}} _{2} , {\hat{S}} _{3} , {\hat{S}} _{4} , {\hat{S}} _{5} ,..., {\hat{S}} _{100}$가 크기가 100인 하나의 표본이고
이들의 평균 $\sum _{i=1} ^{100} \frac{\hat{S}_{i}}{100}$는 ${\hat{S}}$의 기댓값 $E( {\hat{S}} )=S$에 수렴한다
따라서 참값 $E( {\hat{S}} )=S$의 추정을 위해서는 실험을 1번만 해서는 안된다.
실험을 수없이 반복하여 얻은 실현치 ${\hat{S}} _{i}$들의 평균을 구해야한다.
추정량을 구하는 시뮬레이션을 할 때 이런 실수를 생각보다 많이하게 된다
6. 예시 코드
원주율 $\pi$의 근삿값을 몬테카를로 시뮬레이션으로 구해보자.
다음과 같이 제1사분면 위에 한 변의 길이가 1인 정사각형을 올려놓고
정사각형안에 반지름의 길이가 1인 원의 1/4을 그려넣는다
그러면 $U(0,1)$에서 매 회 2개의 sample을 random하게 추출하는 것이 길이가 1인 정사각형 안에 있는 점 $(x,y)$를 뽑는 과정과 같다.
원의 방정식 $x^2+y^2=1$을 이용하여 x좌표를 넣어서 $y \leq \sqrt{1-x^2}$를 만족시키면 $(x,y)$는 원 안에 존재한다.
import numpy as np
def random_generator(n):
random_number = []
for _ in range(n):
random_number.append(np.random.uniform(0,1,2))
return random_number
def circle_function(x):
return np.sqrt(1-x**2)
위와 같이 정사각형 내에 점 $(x,y)$를 뽑는 random_generator와 원의 방정식 $y \leq \sqrt{1-x^2}$을 나타내는 circle_function을 구현
in_circle = []
pi_list = []
for _ in range(1000):
random_number = random_generator(100000)
for x,y in random_number:
if y <= circle_function(x):
in_circle.append((x,y))
pi = 4*(len(in_circle)/100000)
pi_list.append(pi)
in_circle = []
np.mean(pi_list)
3.14163476
random_generator로 100000개의 난수를 생성하여 random_number 리스트에 집어넣고
원 안에 존재하는 난수만 in_circle에 넣어서 기하학적 확률로 $\pi$를 추정한다
이러한 실험을 1000번 반복하여 평균을 낸 값을 구해보면 3.14163476...으로 소수점 셋째자리까지 정확하다.
내가 실수한 점은 이 실험을 1번만 했다는 것인데 통계적 추정의 원리에 의해 충분히 많이 여러번 실험해서 평균값을 구해야 한다는 점이다.
7. 표준오차(standard error)
참값 $S$의 추정량 $\hat{S}$는 $E(\hat{S}) = S$를 만족시킨다. 이를 불편추정량(unbiased estimator)이라고 부른다.
참값과 추정값 사이에는 분명한 차이가 있는데, 이를 오차(error)라고 부른다.
$$e = \hat{S} - S$$
많은 경우에 참값은 알 수 없는 값이니까 e를 구하는 것은 불가능하다.
그런데 $\hat{S}$가 확률변수이므로, e도 확률변수이다.
따라서, 여러번 해보면 e가 어느정도 나오리라고 기대할 수 있는데 오차 제곱의 기댓값
$E((\hat{S} - S)^{2})$을 Mean square for error, MSE라고 부른다.
이것을 최소로 하는 추정량 $\hat{S}$를 선택하는 것이 좋은 추정이다.
그런데 $\hat{S}$가 불편추정량 $E(\hat{S}) = S$이므로 분산의 정의에 따라 $E((\hat{S} - S)^{2}) = Var(\hat{S})$이다.
그러므로 추정량의 오차 $\hat{S}$를 $\hat{S}$의 표준편차로 구할 수 있다.
추정량의 표준편차는 표준오차(standard error)라고 부른다.
8. 구간추정
확률변수 $\hat{S}$는 N이 충분히 크면 중심극한정리에 의해 정규분포를 따른다.
$\hat{S} = N_{H}(c(b-a)/N)$의 기댓값은 $N_{H}$가 B(N,p)를 따르므로,
$E(\hat{S}) = S$이고, $Var(N_{H}/N) = p(1-p)/N$이니까, $Var(\hat{S}) = c^{2}(b-a)^{2}p(1-p)/N$
그러므로 N이 충분히 크면 정규분포로 근사시켜서 구간추정을 할 수 있다.
예를 들어 95% 신뢰구간은 다음과 같다.
9. 원하는 오차 이내를 얻기 위해 시행해야하는 횟수
추정량의 오차 $|\hat{S} - S|$가 실험자가 미리 지정한 $\epsilon$이내로 들어올 확률을 $1-\alpha$라고 하자.
$$P(|\hat{S} - S| < \epsilon) >= 1-\alpha$$
$E(\hat{S}) = S$이므로 표준편차로 나누기만 하면 표준화시킬 수 있다.
$$P(\frac{|\hat{S}-S|}{\sqrt{Var(\hat{S})}} < \frac{\epsilon}{\sqrt{Var(\hat{S})}}) >= 1-\alpha$$
그런데 $Var(\hat{S}) = c^{2}(b-a)^{2}p(1-p)/N$
확률 p는 0이상 1이하이므로, p(1-p)는 1/4이하이다.
따라서, $Var(\hat{S}) = c^{2}(b-a)^{2}p(1-p)/N <= c^{2}(b-a)^{2}/4N$
그러므로 $k = \frac{\epsilon}{\sqrt{Var(\hat{S})}} >= 4N\epsilon/(c^{2}(b-a)^{2}) = k'$
표준정규분포는 0에서 대칭이므로 다음과 같이 변형해보면...
$$P(Z < k) = 1-P(Z >= k) >= 1-P(Z >= k') =1-(1-P(Z < k')) = P(Z < k') >= 1-\alpha$$
그러므로 다음과 같은 표준정규분포의 누적분포함수 부등식으로 구해진다.
$$P(Z < 4N\epsilon/(c^{2}(b-a)^{2})) >= 1-\alpha$$
a,b,c, $\epsilon$, $\alpha$은 모두 정해진 상수이고 N만 미지수이다.
표준정규분포의 누적확률분포로부터 N을 구할 수 있다.
'다시보는 통계학' 카테고리의 다른 글
데이터 시험 단골손님인 혼동행렬(confusion matrix) 민감도 특이도 완전정복 (0) | 2022.01.29 |
---|---|
무의식적인 통계학자의 법칙(Law Of The Unconscious Statistician) (0) | 2021.12.30 |
경험분포함수(empirical distribution function) (0) | 2021.12.08 |
누적분포함수와 분위수(quantile)의 관계 (0) | 2021.12.08 |
분포함수에 관한 중요한 정리(theorem) (0) | 2021.12.07 |