Intro : Monte Carlo Approach

luvoatiger·2020년 10월 28일
0

MonteCarloSimulation

목록 보기
1/3
post-thumbnail

지금부터 몬테카를로 시뮬레이션을 알아보도록 하겠습니다. 몬테카를로 시뮬레이션은 몬테카를로 접근법을 이용해서 손으로 쉽게 계산하기 어려운 함수의 값을 구하거나 문제를 수치적으로 푸는 방법입니다. 그렇기 때문에 문제의 특성에 의해 혹은 많은 계산이 필요해서 손으로 쉽게 구할 수 없거나 구하기 어려운 문제들을 푸는 분야에서 광범위하게 사용되며, 대표적인 분야가 베이지안 통계학입니다. 이번에는 몬테카를로 시뮬레이션의 간단한 예시를 통해서 몬테카를로 접근법이 무엇인지 이해해보도록 하겠습니다.

이 포스팅을 이해하려면 학부 수준의 수리통계학 지식이 필요합니다. 또한, 내용에 틀린 점이 있다면 언제든지 말씀해주시기 바랍니다.

시리즈 연재 내용(계획)

  1. 몬테카를로 적분
  2. 역변환법
  3. 채택기각법
  4. 이산확률분포 난수 생성
  5. 연속확률분포 난수 생성
  6. 브라운 운동 생성
  7. 포아송 과정 생성
  8. 시뮬레이션 분산 감축 기법
  9. 부트스트랩
  10. 마르코프 체인 몬테카를로

Monte Carlo Approach

몬테카를로 접근법은 무작위로 발생시킨 난수를 이용해서 함수의 값을 구하는 접근법을 말합니다. 여기서 발생시키는 난수는 주로 표준균일분포입니다. 그 이유는 표준균일분포를 이용하면 특정 이산확률분포 및 연속확률분포 그리고 기대값 등을 근사하기 편리하기 때문입니다. 다음은 표준균일분포의 밀도함수와 분포함수입니다. 작성의 편의를 위해 구간별로 분포함수를 나누지는 않겠습니다.

f(u)=1,0<u<1F(u)=uf(u) = 1, \quad 0 < u < 1 \\ F(u) = u

그렇기에 다음 관계가 성립합니다.

P(a<=U<b)=F(b)F(a)=baP(a <= U < b) = F(b) - F(a) = b - a

그리고 어떤 이산확률분포를 따르는 확률변수를 생성하고 싶다고 합시다. 확률변수 X는 1, 2, 3, 4의 값을 가지고 X의 질량함수 P(X=i)=piP(X=i)=p_{i}는 다음과 같습니다.

p1=0.2,p2=0.15,p3=0.25,p4=0.4p_{1} = 0.2,\quad p_{2} = 0.15,\quad p_{3} = 0.25,\quad p_{4} = 0.4

이를 해결하는 방법 중 하나는 다음과 같습니다
먼저, 위에서 언급한 대로 다음 관계가 성립합니다.

P(p1<=U<p1+p2)=p2P(p_{1} <= U < p_{1} + p_{2}) = p_{2}

이 수식은 난수 UU의 값이 p1p_{1}p1+p2p_{1} + p_{2} 사이에 있을 확률이 p2p_{2}라는 것을 알려줍니다. 그리고 질량함수 P(X=i)=piP(X=i)=p_{i}에서 확률변수 값이 ii일 확률은 pip_{i}임을 알 수 있습니다.

따라서 pip_{i} 값에 맞게 난수 UU가 위치하는 구간을 설계하고 해당 난수가 뽑혔을 시 난수값이 속한 구간에 맞는 확률변수 값을 생성하면, 위의 분포를 따르는 확률변수열을 만들 수 있습니다. 전체 알고리즘은 다음과 같습니다.

IfU<p1,thenX=1Ifp1<=U<p1+p2,thenX=2Ifp1+p2<=U<p1+p2+p3,thenX=3Ifp1+p2+p3<=U<p1+p2+p3+p4,thenX=4If \quad U < p_{1}, \quad then \quad X = 1\\ If \quad p_{1} <= U < p_{1} + p_{2}, \quad then \quad X = 2\\ If \quad p_{1} + p_{2} <= U < p_{1} + p_{2} + p_{3}, \quad then \quad X = 3\\ If \quad p_{1} + p_{2} + p_{3} <= U < p_{1} + p_{2} + p_{3} + p_{4}, \quad then \quad X = 4

길이가 10,000인 확률변수열을 만드는 파이썬 코드는 다음과 같습니다.

# generate random variabe X with pmf p1 = 0.2, p2 = 0.15, p3 = 0.25, p4 = 0.4
random_number_x = np.random.uniform(size=10000)
random_variable_x = np.where(random_number_x < 0.2, 1, np.where(random_number_x < 0.35, 2, np.where(random_number_x < 0.6, 3, 4)))

number_counter = dict()
for random_variable in list(set(random_variable_x)):
    number_counter[random_variable] = list(random_variable_x).count(random_variable)
#결과 : {1: 2035, 2: 1525, 3: 2485, 4: 3955}

결과를 보니 약 40%가 값이 4이므로 원하는 분포가 잘 만들어진 것을 알 수 있습니다.

Conclusion

제가 전달하고 싶은 것은 표준균일분포를 따르는 난수를 사용해서 원하는 분포를 근사할 수 있다는 것이고 이런 방식이 바로 몬테카를로 접근법 이라는 점입니다. 추가적인 이산확률분포 및 연속확률분포를 근사할 때도 표준균일분포를 이용하는데, 그 근거가 되는 정리는 다음 글에서 설명하도록 하겠습니다.

profile
시뮬레이션, 최적화이론에 관심있습니다.

0개의 댓글