관리 메뉴

개발자비행일지

파이썬, 몬테카를로 시뮬레이션 본문

▶ Python

파이썬, 몬테카를로 시뮬레이션

Cyber0946 2020. 7. 15. 17:08

드론 관련하여 칼만필터 논문을 보던 중 몬테카를로 시뮬레이션을 사용하여, 칼만필터의 경향성이 이러함을 보였다. 

라는 문구가 있어서 몬테카를로가 무엇인지에 대해 개인학습 목적을 가지고 정리하고자 한다. 

몬테카를로 시뮬레이션은  프로젝트의 정량적 리스크 분석에 사용되는 리스크 관리 기법이다. 

예를들어서 프로젝트의 목표가 있을 때, 목표 달성의 확률이 얼마나 되는지 확률적으로 계산해 주는 시뮬레이션을 말한다. 

표준분포를 따르는 값을 무작위로 추출해서 결정하고, 이를 반복하여서 확률을 계산하는 방식을 말한다. 

예제를 통해 이해해 보자. 

프로젝트 일정이 언제 끝나는지 분석해 보자.

위와 같을 경우 이 프로젝트는 23~42일의 기간이 소요된다. 

몬테카를로 방식으로 이를 시뮬레이션 하기 위해서는 

1회 : 12 + 6 + 9 = 27

2회 : 17 + 8 + 14 = 39

3회 : 13 + 7 + 10 = 30

이렇게 1000 회를 반복한다. 

이제 1000번의 수행 중에 각각의 합산 값이 몇번 씩 발생했는지를 기록한다. 

이 데이터를 가지고 누적 그래프를 만들면, 해당 날짜 몇일 내에 끝나는 지를 확률로써 말할 수 있는 것이다. 

위에서 25일 이내 끝나는 확률을 10+20+30 / 1000 -> 6%의 확률을 가진다. 

자 그럼 이런 몬테카를로를 파이썬을 이용해서 한번 배워보도록 하자. 

원의 넓이를 추정해 보도록하자. 

몬테카를로 방법의 가장 간단한 예시로는 원주율(π)의 값을 추정하는 것이다.
넓이가 1인 정사각형을 생각하자. 정사각형의 한 꼭지점을 중심으로 반지름이 1인 사분원을 정사각형 안에 그린다. 그러면 사분원이 차지하는 넓이는 π/4가 될 것이다. 이제, 0 <= x <= 1인 x를 임의로 가져오고, 독립적으로 0 <= y <= 1인 y를 임의로 가져온 후, x^2 + y^2 <= 1일 확률은 사분원이 차지하는 넓이와 같은 값인 π/4가 된다.
이 과정을 여러 번 수행하는 알고리즘을 작성하고, 원주율의 값을 추정해 보자.
import numpy as np 
import matplotlib.pyplot as plt 
import math
s = 1000
xs = np.random.random_sample(s)*2-1
#[0,2)-> [-1,1) 사이의 임의의 실수 
ys = np.random.random_sample(s)*2-1
#[0,2) -> [-1,1)

cnt = 0
plt.figure(figsize=(5, 5))
for i in range(0, s):
    x, y = xs[i], ys[i]
    if x**2 + y**2 <=1:
        cnt+=1
        plt.scatter(x, y, c='blue', alpha=0.2)
    else:
        plt.scatter(x, y, c='red', alpha=0.2)
        
print((cnt/s)*4)
#x,y좌표가 [-1,1],[-1,1]인 직사각형의 넓이 4의 안에서 cnt/s 만큼의 비율을 가지기 때문에 비율 *면적을 곱해줘야 한다..
print(math.pi)
plt.show()