본문 바로가기
프로그래밍 ( Programming )/머신러닝 ( ML )

몬테 카를로 (Monte Carlo)

by Jayce_choi 2023. 4. 20.
반응형

몬테카를로 메서드 또는 다중 확률 시뮬레이션이라고도 하는 몬테카를로 시뮬레이션은 불확실한 사건의 가능한 결과를 추정하는 데 사용되는 수학적 기법입니다.

예를 들어서 집에서 회사를 갈 때 단순하게 고려하면 거리에 따라서 얼마나 시간이 걸릴지를 고려하여서 상당히 결정적입니다. 그러나 실제 상황에서는 교통 혼잡, 악천후 및 차량 고장등 확률적으로 낮은 상황들이 발생할 수 있기에 불확실성을 고려한 이동시간을 예측할 수 있습니다.

핵심은 반복적인 무작위적 샘플링입니다 (이러한 특징때문에 카지노와 도박장이 유명한 몬테카를로 지역이름을 채택하기도 하였습니다)

문제를 해결하기 위해서 반복적인 랜덤 샘플링을 통해서 문제를 풀게 되며, 기존에 우리가 생각하던 문제 해결 방식인 절차에 따라서 기계적으로 해결하는 방식과는 다른 방식입니다. 객관적인 미래 예측 방법이며 변수와 결과 사이의 관계를 설명하지 못하는 모델 또는 상황, 확률 모형 (Stochastic model)일 때 강력한 힘을 발휘할 수 있습니다.

무작위로 추출된 난수를 이용하여 원하는 함수의 값 또는 파라미터 값을 예측하기 위해서 적용하는 방법으로 자유도가 높은 장점을 가지고 있습니다. 하지만 어느정도 오차는 감안해야 하며 무작위적인 샘플링 접근 방법이기 때문에 정확한 해를 보장하지는 못하지만 어느 정도 근사를 할 수 있다는 장점을 가지고 있습니다. 

 

Application Field

몬테 카를로 방법은 불확실성이 증대되고 있는 다양한 분야 (산업 및 금융, 로켓, 전기 전자...)에서 적용되고 있습니다. 해석적으로 모든 것을 표현하지 못함으로써 오는 예측 불확실성을 몬테카를로 시뮬레이션을 통해서 어느 정도 단점을 극복하고 있습니다.

 

Monte Carlo Simulation Components

몬테카를로 분석을 위해서 다음 요소들이 필요합니다.

  • 입력 변수 (무작위 값이며, 예를 들어서 제조 품질, 온도와 같이 스마트폰 내구성에 영향을 미치는 요소들입니다)
  • 출력 변수 (입력 변수에 영향을 받았을때 나오는 결과로써 스마트폰의 기대 수명 값이 될 것입니다)
  • 수학적 모델 (출력 변수와 입력 변수 간의 관계를 설명하는 방정식입니다)

 

Monte Carlo Process

순서는 다음과 같습니다.

  1. 문제정의 (해결하고자 하는 문제 상황에 대해서 구체적으로 정의)
  2. 확률변수 선택 (예측하려는 확률 모형에 영향을 미치는 요소들 선택) 
  3. 난수 발생 (다양한 Sampling 방식이 있으며 최신의 소프트웨어를 통해서 사이클이 긴 난수 생성기를 이용하여 난수 생성)
  4. 반복 실험 (생성된 난수를 식에 대입하여서 시뮬레이션을 지속적으로 수행)
  5. 모델 생성 (어느 정도 Confidence Interval안으로 수렴하였을 때 반복을 멈추고 결과를 해석함)

 

Monte Carlo Example

대표적인 예시로 원주율을 예측하는 예시입니다. 원주율 값은 3.14와 매우 근접한 값을 가지고 있습니다. 

이를 예측하기 위해서 먼저 아래의 1/4 원을 먼저 고려할 것입니다.

여기서 무작위로 점을 발생시켰을 때 아래 그림의 파란 영역에 점이 찍히는 수와 그리고 파란 영역을 포함하면서 가로, 세로 길이 1을 가진 전체 정사각형에 찍히는 점의 숫자의 비율을 따져 볼 것입니다. 

점을 찍어서 분모, 분자의 크기가 얼마인지를 확인해 볼 것입니다.

확인이 되면 P의 크기에 4를 곱하게 되면 결국 반지름 1인 원의 넓이가 될 것이며 이는 원 넓이 공식에 의해서 4P = 원주율이 될 것입니다. 

이를 위해서 다음 요소가 필요합니다. 점이 찍혔을 때 (파란 영역) 원의 영역에 들어왔는가를 확인을 해야합니다. 한가지 점이 찍혔을때 0,0 원점으로부터 찍힌 점까지 거리가 만약 1보다 크다면 파란 영역이 아닐 것이며, 만약 1보다 작다면 파란 영역에 속할 것입니다. 

 

코드는 다음과 같습니다. 

import numpy as np
from multiprocessing import Pool
from matplotlib import pyplot as plt

if __name__ == '__main__':
    N = 10000 #10000개의 난수 발생
    x = np.random.random([N, 2])
    
    distance = np.sqrt(np.sum(x ** 2.0, axis=1))
    in_out = distance <= 1.0
    print(in_out)
    pi = np.sum(in_out)*4/N # Pi 값은 천제 시행에서 원 안에 있는 점의 갯수로 정해짐
    color = list(map(lambda x: 'red' if x else 'blue', in_out)) # 원의 안, 밖에 따른 색상 설정

    plt.figure(figsize=(5, 5))
    plt.scatter(x[:,0], x[:,1], color = color, s=5, label ='Result : {}'.format(np.round(pi, 4)))
    
    cx = np.cos(np.linspace(0, np.pi/2, 1000))
    cy = np.sin(np.linspace(0, np.pi/2, 1000))
    plt.plot(cx, cy, color = 'black', lw =2) # 원의 경계
    plt.legend(loc = 'lower right')

    plt.xlim(0, 1)
    plt.ylim(0, 1)
    plt.show()

지금은 n= 10000개일 때의 결과입니다. 원주율은 3.1548 정도로 계산되었습니다. 만약 샘플 개수 (n)이 더 커지게 된다면 어떻게 될까요?

아래는 n=10000부터 총 10000*100까지 한 결과입니다. 점차 수렴하는 값이 보이며 우리가 알고 있는 3.14 근처로 더 근접하였습니다. 

이 결과를 통해서 예측할 수 있는 것은 n의 크기가 무한대로 갈수록 우리가 아는 원주율에 더 가깝게 가게 된다는 것입니다.

물론 원의 넓이는 적분을 통해서 쉽게 계산할 수 있습니다. 때문에 Computation time도 훨씬 적게 들것입니다. 하지만 문제의 수준이 원주율을 구하는 1차원 문제가 아닌 고차원으로 가게 되어서 고려할게 많아진다면 상대적으로 훨씬 Efficient 하게 답을 내릴 수 있게 됩니다.

 

What is the proper size of n?

과연 언제까지 반복을 해야 하는 것인가에 대해서 궁금증이 생길 수 있습니다.

 

먼저 이를 해결하기 위해서 theta는 Estimator를 통해서 나온 theta값들의 기댓값이라고 하겠습니다. 

이때 Confidence Level을 정의하기 위해서 알파값을 도입하였습니다. 알파값은 0~1 사이 값이며 특정 값(1-알파)을 만족하는 확률을 가지는 것을 체크합니다.

또한 확률 안에 정의된 식을 통해서 한번 Estimator가 얻은 Sample average값이 theta와 뺄셈을 하였을 때 입실론 (작은 상수 값, Error tolerance) 보다 작을 때의 확률을 얻습니다. 

Central Limit Theorem은 표본의 크기가 커질수록 표본 평균 들이 이루는 분포가 모집단 평균 μ 그리고 표준편차가 σ/√n 인 정규분포에 가까워지는 정리입니다. 식으로 표현하면 아래와 같습니다.

이를 이용하면 우리는 2번째 식을 아래와 같이 전개할 수 있으며..

*여기서 파이 (Φ)는 Standard normal cumulative distribution function (cdf)입니다.

최종적으로 정리하면 n은 위와 같이 됩니다. 하지만 실제에서는 variance (sigma^2)를 모르기에 이 또한 평균값을 이용합니다.

 

Reference

-Monte Carlo Simulation Notes (Shane Henderson, Kevin Kircher)

반응형

댓글