Monte Carlo Approach
몬테카를로 접근법은 무작위로 발생시킨 난수를 이용해서 함수의 값을 구하는 접근법을 말한다. 최적화, 수치적분, 확률분포 근사 등등 여러 가지 분야에 쓰이고 있다.
핵심 아이디어
몬테카를로 시뮬레이션을 할 때는 주로 표준균일분포의 난수를 발생시키는데, 그 이유는 표준균일분포를 이용하면 특정 이산확률분포 및 연속확률분포 그리고 기대값 등을 근사하기 편리하기 때문이다. 또한, 표준균일분포를 따르는 난수는 \(0\) 과 \(1\) 사이의 값을 갖기 때문에 확률과 유사하게 생각할 수 있다.
표준균일분포를 따르는 확률변수 \(U\) 의 밀도함수 \(f(u)\)는 \(0\)과 \(1\) 사이에서 \(1\)의 값을 갖는다. 그리고 분포함수 \(F(u)\)는 \(u < 0\)이면 \(0\), \(0 \leq u \leq 1\)이면 \(u\), \(u > 1\)이면 \(1\)의 값을 갖는다. 그렇기에 다음 관계가 성립한다.
$$ P(a \leq U \leq b) = F(b) - F(a) = b - a $$
이 수식을 다음처럼 확률에 적용해 볼 수 있다.
$$ P(p_{1} \leq U < p_{1} + p_{2}) = p_{2} $$
이 수식은 난수 \(U\)의 값이 \(p_{1}\) 과 \(p_{1} + p_{2}\) 사이에 있을 확률이 \(p_{2}\)라는 것을 알려준다.
예제
-
반지름 1인 원의 넓이는 \(\pi\)이고, 길이 2(지름 2)인 정사각형의 넓이는 4이다.
-
기하학적 확률에 의해서 0부터 2 사이의 난수를 많이 뽑았을 때 반지름 1인 원의 넓이에 들어갈 확률은 \(\frac{\pi}{4}\) 가 된다.
-
그리고 0부터 2 사이의 난수를 많이 뽑았을 때 반지름 1인 원의 넓이에 들어갈 확률은 큰 수의 법칙에 의해서 \(\frac{\pi}{4}\)가 된다.
- 따라서, 반지름 1인 원 안에 들어간 난수만 채택하고 나머지는 버린 다음, 이들의 평균을 취하면 파이를 추정할 수 있다.
코드
# pi를 추정하기
x = 2 * np.random.uniform(0, 1, 1000000) - 1 # X = 2U - 1 where U ~ uniform(0, 1)
y = 2 * np.random.uniform(0, 1, 1000000) - 1 # Y = 2U - 1 where U ~ uniform(0, 1)
candidate = x ** 2 + y ** 2 # X^2 + Y^2
pi = 4 * np.mean(np.where(candidate <= 1, 1, 0)) # label 1 if X^2 + Y^2 <=1 else 0, and apply mean function
print(pi) #3.141924