Skip to content
Home » 몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 인기 답변 업데이트

몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 인기 답변 업데이트

당신은 주제를 찾고 있습니까 “몬테카를로 시뮬레이션 예제 – 몬테칼로 시뮬레이션이란?“? 다음 카테고리의 웹사이트 https://kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 T. K. Min 이(가) 작성한 기사에는 조회수 14,663회 및 좋아요 176개 개의 좋아요가 있습니다.

Table of Contents

몬테카를로 시뮬레이션 예제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 몬테칼로 시뮬레이션이란? – 몬테카를로 시뮬레이션 예제 주제에 대한 세부정보를 참조하세요

프로젝트 리스크관리에서 정량적 리스크 분석 기법으로 이용되는 몬테칼로 시뮬레이션에 대한 설명입니다.

몬테카를로 시뮬레이션 예제 주제에 대한 자세한 내용은 여기를 참조하세요.

예제: 몬테 카를로 시뮬레이션 – 함수 – PTC Support Portal

예제: 몬테 카를로 시뮬레이션. montecarlo 함수를 사용하여 함수를 시뮬레이션하는 난수 표본을 생성합니다. 1. 시뮬레이션할 함수를 정의합니다.

+ 여기에 더 보기

Source: support.ptc.com

Date Published: 5/18/2022

View: 6354

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드). 공부하는박사곰 2021. 8. 12. 13:12. 320×100.

+ 자세한 내용은 여기를 클릭하십시오

Source: studyingrabbit.tistory.com

Date Published: 3/4/2022

View: 1251

몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 모든 …

몬테카를로 시뮬레이션 예제 주제에 대한 자세한 내용은 여기를 참조하세요. · 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 · 몬테카를로 시뮬레이션 (2) – …

+ 여기에 보기

Source: you.xosotanphat.com

Date Published: 10/13/2021

View: 1972

Top 6 몬테카를로 시뮬레이션 예제 51 Most Correct Answers

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드). Article author: studyingrabbit.tistory.com …

+ 여기에 표시

Source: toplist.future-user.com

Date Published: 5/8/2022

View: 7855

몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제 – 홍러닝

[알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (1) – 파이 계산하기 쇼핑몰을 운영하는 온라인 판매자가 있습니다.

+ 여기에 자세히 보기

Source: hongl.tistory.com

Date Published: 5/2/2022

View: 9931

Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답

Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 · 정답은 어디까지나 참고용입니다. · 주의: 인터넷에 나머지 연산(%)으로 난수의 범위를 조정 …

+ 여기에 더 보기

Source: m.blog.naver.com

Date Published: 11/25/2021

View: 3439

몬테카를로 시뮬레이션(Monte Carlo Simulation)

실제 비지니스 의사결정에 손쉽게 적용할 수 있을 법한 단순한 예제를 통해 몬테카를로 시뮬레이션을 살펴봅니다.

+ 더 읽기

Source: su79eu7k.github.io

Date Published: 7/25/2021

View: 6702

몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 빠른 …

몬테카를로 시뮬레이션 예제 주제에 대한 자세한 내용은 여기를 참조하세요. 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해. 몬테 카를로 …

+ 여기에 표시

Source: ppa.khunganhtreotuong.vn

Date Published: 3/6/2022

View: 5017

몬테카를로 시뮬레이션 01 – velog

몬테카를로 시뮬레이션을 통해 수확적 확률에 수렴 하는지 테스트를 해 보겠습니다. 코드 설명 시행에 대한 정의 부분입니다. trial := random sample {0, …

+ 자세한 내용은 여기를 클릭하십시오

Source: velog.io

Date Published: 11/2/2021

View: 2804

주제와 관련된 이미지 몬테카를로 시뮬레이션 예제

주제와 관련된 더 많은 사진을 참조하십시오 몬테칼로 시뮬레이션이란?. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

몬테칼로 시뮬레이션이란?
몬테칼로 시뮬레이션이란?

주제에 대한 기사 평가 몬테카를로 시뮬레이션 예제

  • Author: T. K. Min
  • Views: 조회수 14,663회
  • Likes: 좋아요 176개
  • Date Published: 2019. 3. 19.
  • Video Url link: https://www.youtube.com/watch?v=m40JuOUf9Ag

예제: 몬테 카를로 시뮬레이션

예제: 몬테 카를로 시뮬레이션

montecarlo 함수를 사용하여 함수를 시뮬레이션하는 난수 표본을 생성합니다.

1. 시뮬레이션할 함수를 정의합니다.

f x y 2 x 0.5 y

2. 각 매개변수의 분포를 정의합니다.

dist Normal Uniform

dist 의 두 성분은 Normal Uniform 벡터의 두 성분은함수를 나타냅니다.

3. 각 분포의 평균 및 표준 편차를 정의합니다. 결과를 행렬 Rvals 에 기록합니다.

μ_x 7.5 μ_y 5 σ_x 1.2 σ_y 0.84

Rvals X Y μ_x μ_y σ_x σ_y

4. 매개변수 Y 에 대한 상한값을 설정합니다.

upper_limit 8.5

lim NaN NaN NaN upper_limit

5. 생성할 표본 수를 정의합니다.

n 500

6. montecarlo 를 호출하여 표본을 생성합니다.

M montecarlo f n Rvals dist lim

montecarlo 함수로 구한 출력은 세 개의 열이 있는 행렬입니다.

M

처음 두 열은 각 매개변수에서 생성된 표본입니다. 마지막 열은 이러한 매개변수가 적용된 함수 f 의 출력입니다.

7. 생성된 값을 별도의 벡터에 기록합니다.

i 0 rows M 2 X1 i M i 1 0 Y1 i M i 1 1 R1 i M i 1 2

마지막 벡터 R1 이 함수 f 의 출력인지 확인할 수 있습니다.

R1 0

f X1 0 Y1 0

8. 매개변수 간의 관계를 도표화하고 해당 평균을 도표화합니다.

X_mean μ_x μ_x range_y 0 9 Y_mean μ_y μ_y range_x 3.5 11.5

lines lines lines 9 X1 range_x X_mean 3.5 4.5 11.5 11 Y1 Y_mean range_y 0 9

표본이 Y축에 대해 균일하게 분포되어 있으며 X축에 대해 정규 분포를 보입니다. y 값이 8.5 이상인 표본은 무시됩니다.

9. histogram y 값을 10개의 빈(bin)으로 분리합니다. y 값의 히스토그램을 도표화합니다. 을 호출하여값을 10개의 빈(bin)으로 분리합니다.값의 히스토그램을 도표화합니다.

H_Y histogram 10 Y1

columns 9 H_Y 0 0 1 8 11 H_Y 1 0

y 값이 균일하게 분포되어 있습니다. 표본은 평균을 중심으로 양쪽에 6시그마를 생성합니다.

μ_y

width σ_y 6

LB UB μ_y width μ_y width

생성된 표본이 상한값보다 큰 경우 무시됩니다.

upper_limit

10. histogram 을 호출하여 x 값을 10개의 빈(bin)으로 분리합니다. y 값의 히스토그램을 도표화하고 정규 분포를 추가합니다.

H_X histogram 12 X1

h 0 rows H_X 1

Norm h dnorm H_X h 0 μ_x σ_x

columns lines 9 H_X 0 3.5 4.5 11.5 11 H_X 1 Norm 0.004

x 값이 정규 분포됩니다.

11. 각 매개변수에 대한 결과를 도표화합니다.

lines 9 X1 3.5 4.5 11.5 10 R1 26

lines 10 Y1 0 1 9 10 R1 26

12. 특수 구문 if NaN 으로 바꿉니다. 특수 구문를 호출하여 제약 조건을 정의하고 제약 조건을 충족하지 못하는 결과를으로 바꿉니다.

j 0 2

p i j if X1 i Y1 i 14 M i 1 j NaN

q i j if X1 i 2 2 Y1 i 75 p i j NaN

13. 매개변수 간의 관계를 도표화합니다.

X2 q 0

Y2 q 1

R2 q 2

lines 9 X2 3.5 4.5 11.5 11 Y2 0

14. 각 매개변수에 대한 결과를 도표화합니다.

lines 9 X2 3.5 4.5 11.5 10 R2 26

lines 10 Y2 0 1 9 10 R2 26

식 복사

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드)

728×90

몬테카를로 시뮬레이션(혹은 알고리듬)이란 무엇인지를 정의하기란 매우 어려운데, 그 이유는 이 방법론을 수학과 응용수학 분야에서 매우 광범위하게 사용하기 때문입니다.

(1 )이 시뮬레이션을 이용하여 계산 하려는 대상(값)

(2) 이 시뮬레이션을 이용해야 하는 이유

(2) 이 시뮬레이션의 전체 혹은 일부를 이용하는 방법

등에 따라서, 몬테 카를로 시뮬레이션에 대한 정의는 조금씩 다를 텐데요, 그러나 이 방법론을 사용하는 모든 경우를 아우를 수 있는 핵심점인 키워드는 “반복적인 무작위적 샘플링” 입니다. 위키피디아의 몬테 카를로 시뮬레이션을 소개하는 첫 문장은

Monte Carlo methods, or Monte Carlo experiments, are a broad class of computational algorithms that rely on repeated random sampling to obtain numerical results. The underlying concept is to use randomness to solve problems that might be deterministic in principle.

입니다. 우리 말로 적당히 번역하면

광범위한 계산 알고리듬의 일종인데, 특히 반복적인 랜덤 샘플링에 의존하여 결과를 얻는 것. 문제를 풀기 위해 (그 문제가 결정론적인 원리라고 하더라도) 무작위성을 이용한다

가 중요한 부분이 될 것 입니다. 보통 알고리듬이라고 하면, “주어진 절차에 따라서 기계적인 방식으로 문제를 해결” 하는 것을 떠올리는데 여기에는 무작위성이 파고 들어갈 공간이 없습니다. 그러나 몬테 카를로 시뮬레이션에서는 무작위성이 핵심적인 역할을 하게 됩니다.

이렇게 저렇게 설명을 길게 하는 것 보다는 간단하긴 하지만 핵심적인 시뮬레이션을 하나 해 보면서 몬테 카를로 시뮬레이션이 무엇인지를 “느껴” 보는 것이 더 중요한 것 같습니다. 몬테 카를로 시뮬레이션 설명에서 꼭 나오는 “원주율값 구하기”를 해 보면서 몬테 카를로 시뮬에이션이 어떻게 사용될 수 있고, 기존의 다른 알고리듬 대비 얼마나, 혹은 어떻게 그 효율성을 줄 수 있는지를 알아 보도록 하겠습니다.

원주율값 $\pi$ = 반지름이 1인 원의 넓이

라는 것에 착안하여 반지름이 1인 원의 넓이를 시뮬레이션의 방법을 통해 정확히 구하면 원주율 $\pi$를 구할 수 있습니다. 넓이를 구하는 것이니, 적분을 하면 될텐데요. 반지름의 길이가 1인 원의 방정식은 $x^2 + y^2 =1$ 이므로, 원이 넓이는 $x^2 + y^2 <1$ 인 영역의 넓이를 구하는 것과 같습니다. 이 식을 $y$에 대한 식으로 바꾸면 $y = \sqrt{1-x^2}$ 이므로, 원의 넓이 이면서 원주율 값은 $$S = \pi = 4\int_{0}^{1}\sqrt{1-x^2}dx$$ 이 됩니다. 1사분면에서 넓이를 계산하고 여기에 곱하기 4를 해 준것 입니다. 이 적분은 역삼각함수를 이용하면 부정적분을 구할 수 있고, 간단하게 값이 $\pi$가 된다는 것을 알 수 있습니다. 따라서, 시뮬레이션적인 방법을 통해서 원의 넓이 (혹은 1사 분면에서의 원의 넓이)를 구하면 원주율 값을 구할 수 있다는 결론을 얻습니다. 즉, 적분을 해야합니다. 무작위로 점을 찍는 방법을 통해 넓이를 구하자 1사분면에 원을 그렸습니다. 원의 내부는 빨간색, 원의 외부는 파란색으로 칠했습니다. 우리의 목표는 빨간색 부분의 넓이를 구하는 것 입니다. 물론 구분구적법을 통해서 구해도 되지만, 이번에는 다른 방법을 통해서 구해보도록 하겠습니다. 가로 세로의 길이가 1인 정사각형안에 한 점을 무작위적으로 고른다면, 그 점이 붉은색이 될 확률과 파란색이 될 확률은 붉은색 영역의 넓이와 푸른색 영역의 넓이의 비율과 같을 것 입니다. 그런데 여기서 전체 넓이는 1이기 때문에, 붉은색 영역이 선정될 확률 = 붉은색 영역의 넓이 = 반지름이 1인 원의 넓이의 $1/4$ = $\pi/4$ 가 됩니다. 즉, 우리가 무작위적으로 한 점을 선택했을 때, 이 점이 붉은색 영역에 속한 점이 될 확률을 정확히 원주율이 $1/4$이 됩니다. 따라서, 만일 우리가 무작위적으로 점을 선택(찍는) 과정을 반복한다면 확률의 큰수 법칙에 따라서 전체 점의 갯수 중에서 빨간색 영영역의 점의 갯수의 비율은 정확히 $\pi/4$가 될 것 입니다. 이를 수식적으로 정확하게 표현하면, $$\pi/4 = \frac{\text{선택된점이 빨간색 영역에 속하는 횟수}}{\text{무작위적으로 한 점을 고르는 횟수}}$$ 가 됩니다. 여기에서의 가정은 무작위적으로 고르는 시행이 가로 세로 길이가 1인 정사각형의 모든 점을 정말로 무작위적이고 고르게 뽑아야 한다는 것 입니다. 특정 영역에 점을 많이 뽑거나 혹은 반대로 특정 영역의 점을 적게 뽑는다면 위 방법을 통해서 계산한 원주율 값은 우리가 알고 있는 원주율값과 많이 다를 것 입니다. 또한, 위 과정을 매우 많이 반복해야만 실제 원주율 값과 비슷한 값을 얻을 수 있을 것 입니다. 프로그래밍을 통해서 무작위로 점을 찍어 보자 파이썬 프로그래밍을 통해서 위 영역에서 100개의 점을 무작위로 선택했고, 이 점이 원이 내부에 있는경우에는 빨간색으로, 원의 외부에 있는 경우에는 파란색으로 표시하였습니다. 완전히 고르게 퍼져 있는 것은 아니지만, 점들이 나름대로는 넓게 잘 펼쳐져 있는 것 같습니다. 위의 구체적인 예시에서는 빨간점 : 81개 파란점 : 19개 를 얻었고, 따라서 위 식에 대입하면 $\pi = 4 \frac{81}{100} = 3.24$ 값을 얻게 됩니다. 실제 $\pi$값과는 좀 다르지만 그런대로 괜찮은 값을 얻은 것 같습니다. 앞서 언급한대로 시행의 횟수를 키워야 좀 더 정확한 넓이의 비율을 구할 수 있기 때문에, 시행의 횟수N 를 1000, 10000, 100000으로 늘려 보겠습니다. 영상으로 보면 더 이해하기 쉬운데요, https://youtu.be/SV41AeVk_Oc 결과는 위와 같습니다. 각 경우 구해진 $\pi$값은 N = 1000 : 3.12 N =10000 : 3.1308 N =100000 : 3.137 로 N이 증가하면 증가할 수록 원주율값과 차이가 줄어듦을 알 수 있습니다. 위 시뮬레이션에서는 각 시행 횟수 마다 단 한 번의 실험을 한 것 인데요, 이걸 여러번 반복해 보면 좀 더 정확한 결과를 얻을 수 있지 않을까요? 위 그래프는 각 시행횟수 N 마다 100번의 반복된 실험을 한 결과를 보여주고 있습니다. X축은 1, 2, 3, 4, 5 값을 갖는데 각각 시행 횟수 N = 10, 100, 1000, 10000, 10000 를 의미합니다. 10의 거듭 제곱의 값 입니다. Y 축은 각 시행에서 얻어진 원주율 값 입니다. 이 결과를 보면 "N이 커질 수록 각 시행의 값이 실제 원주율값에 가깝에 얻어지고, 각 시행의 편차가 작아진다" 를 확인할 수 있습니다. 이는 확률과 통계에 대한 우리의 기본적인 직관과 일치합니다. 더 많은 시행을 할 수록 주어진 확률에 수렴하는 것 입니다. 실제로 이 시행은 이항 분포를 통해서 설명할 수 있습니다. 한 점을 무작위로 선택했을 때, 빨간점 혹은 파란점이 선택되면서 (우리가 관심이 있는) 빨간색이 될 확률을 $\pi/4$가 됩니다. 그래서 시행횟수를 N이라 했을 때, 빨간점이 나오는 확률은 이항 분포 $B(N, \pi/4)$가 됩니다. 따라서 빨간점의 기대값은 $N \frac{\pi}{4}$ 이고, 표준편차는 $\sqrt{N \frac{\pi}{4} (1-\frac{\pi}{4} )}$가 됩니다. 최종적으로 구하고 싶은 원주율값은 빨간점의 기대값에 4를 곱하고 N으로 나누는 것이니 시뮬레이션을 통해서 구해지는 원주율값의 표준편차는 $\frac{1}{\sqrt{N}}$에 비례하게 됩니다. 각 시행횟수 N 마다 100번씩 반복 실험한 위 결과가 이항 분포의 성질에 부합됨을 알 수 있습니다. 요약하면, 위와 같이 시행횟수 N을 매우 크게 하면, 원주율값과 매우 유사한 결과를 얻을 수 있고, 이때의 에러(실제 원주율 값과 시뮬레이션을 통해 얻은 원주율 값이 차이)는 $\frac{1}{\sqrt{N}}$에 비례하게 됩니다. 넓이는 그냥 구분 구적법을 통해서 구하면 되는게 아닌가? 위 방법을 통해 원주율 값을 계산한 과정을 다시 한 번 살펴보면, 구분구적법을 통해서 넓이를 구하지 않고 무작위적인 점찍기 방법을 통해서 붉은색 영역의 넓이를 구했다는 것을 발견할 수 있습니다. 앞서 언급했지만, 붉은 영역의 넓이를 정확하게 구하기 위해서는 구분구적법을 하면 됩니다. 구분구적법은 매우 간단한 알고리듬이라서 설명은 생략하고 바로 결과만을 제시하면, 위 그래프와 같습니다. 구분구적법에서는 [0, 1] 사이를 많은 조각으로 나누는데, 위 그래프의 x축은 몇 조각으로 나누었는지에 대한 값입니다. 앞의 그래프에서와 같이 위 값은 10의 거듭제곱값으로 1, 2, 3, 4, 5는 각각 10, 100, 1000, 10000, 100000 조각으로 나누어서 구분구적법을 계산한 것 입니다. 100000 조각으로 나누어서 계산한 원주율 값은 3.141612로 우리가 알고 있는 원주율값 3.141592와 매우 유사합니다. 이처럼 구분구적법을 통해서 계산을 하면, 몬테 카를로 시뮬레이션을 통해 계산을 하는 것에 비해서 (1) 프로그래밍 코드를 만들기 쉬움 (2) 같은 시행 횟수를 하더라도 몬테 카를로 시뮬레이션 대비 더 정확한 계산을 할 수 있음 몬테 카를로 계산으로 100000번 무작위 선정을 한 경우 원주율 값 : 3.137 구분구적법으로 100000번 나누어 계산한 원주율 값 : 3.142 와 같은 장점이 있습니다. (2)를 조금 더 상세하게 설명하면, 구간 [0, 1]를 N 조각 하여 계산하는 경우, 구분구적법과 몬테 카를로 시뮬레이션 모두 N에 비례하는 계산량이 필요합니다. 이때 에러는 구분구적법의 경우 $\frac{1}{N}$에 비례하게 되고, 몬테 카를로 시뮬레의 경우 $\frac{1}{\sqrt{N}}$에 비례 하게 됩니다. N이 커지면 구분구적법의 에러가 훨씬 더 작아지는 것 입니다. 그렇기 때문에 위와 같은 결과가 얻어진 것 입니다. 위 (1), (2)를 보면 구분구적법 대비 몬테 카를로 시뮬레이션의 장점이 없는 것 같은데, 굳이 왜 몬테 카를로 시뮬레이션을 하는 것 일까요? 차원이 높아진다면 어떨까? 우리가 다루는 원주율값을 구하는 구체적인 문제에서는 적분을 해야하는 차원은 1차원이었습니다. 즉 $y = f(x)$에서 $x \in R^1$, $y \in R^1$ 이었습니다. 만일 적분을 해야하는 차원이 1차원이 아닌 일반적인 $D$ 차원이라면 (즉, $x$가 실수가 아닌 일반적인 $D$ 차원의 벡터) 어떻게 될까요? 동일한 정도의 에러를 갖는 답을 얻기 위해서, 구분구적법과 몬테 카를로 시뮬레이션에서 몇 번의 계산을 해야하는지를 알아 보겠습니다. 구체적인 예를 들어 $1/1000 = 10^{-3}$ 만큼의 에러를 갖는 값을 계산해야 한다고 생각하겠습니다. 몬테 카를로 계산의 경우 N번 무작위 선택 계산을 할 때, 오차가 $\frac{1}{\sqrt{N}}$에 비례 하기 때문에 무작위 선택 계산을 $10^6$ 번 해야합니다. 구분구적법의 경우 각 차원의 영역을 N 등분 할 때, 오차가 $\frac{1}{N}$이 되기 때문에 영역 등분을 $10^3$ 만큼 해야합니다. 따라서 차원이 $D$라면, 전체 공간에서 그리드의 갯수는 $10^{3D}$ 가 되고, 계산량은 이에 비례해 증가 합니다. 정리하면 몬테 카를로 : $10^{6}$, 즉 변화가 없음 구분구적법 : $10^{3D}$, 차원 $D$에 지수적으로 증가 가 됩니다. 1차원에서는 구분구적법이 유리하고(계산량이 더 적고), 2차원에서는 동일하며, 3차원 이상에서는 몬테 카를로 시뮬레이션이 더 유리합니다. 이 점이 매우 중요합니다! 몬테 카를로 시뮬레이션의 이 같은 장점은 $x$의 차원이 커지면 커질수록 극명해 지는데요, 만일 $D=10$ 이라고 한다면 몬테 카를로 시뮬레이션의 계산량은 $10^{6}$ 로 변함이 없지만, 구분구적법의 경우 $10^{30}$이나 됩니다. 현존하는 슈퍼 컴퓨터를 동원하더라도 계산이 불가능할 정도로 계산량이 늘어 납니다. 물론 좀 더 효율적인 구분구적법 알고리듬을 사용한다면 계산량을 줄일 수 있습니다. 하지만, 차원이 높아짐에 따라서 계산량이 지수적으로 증가하는 현상은 피할 수 없습니다. 정리 위 구체적인 예시, 그리고 구분구적법과의 비교를 통해서 몬테 카를로 시뮬레이션이 어떻게 수행 되는지, 그리고 다른 시뮬레이션(알고리듬)과의 차이가 무엇인지를 알아보았습니다. 요약하면 몬테 카를로 시뮬레이션은 (1) 무작위 샘플링(위 예시에서는 무작위로 점을 찍는 것)의 반복을 통해서 원하는 값을 얻는다 (2) 구분구적법과 같이 모든 경우를 전부 계산 하는 방법과 비교하면, 공간 차원이 커질 수록 몬테 카를로 계산이 우월해 진다 (동일한 오차의 값을 얻기 위한 계산량이 적어 진다) 의 성질을 갖습니다. 추가적인 포스팅을 통해서, 구체적인 활용에서 위 두 성질이 어떻게 이용되는지를 알아 보도록 하겠습니다. 파이썬 시뮬레이션 코드 아래는 위 계산에서 사용된 파이썬 시뮬레이션 코드 입니다. 파이썬을 활용할 줄 안다면, 아래 코드를 복-붙 하여 사용할 수 있습니다. # 필요한 라이브러리 불러오기 import numpy as np from multiprocessing import Pool from matplotlib import pyplot as plt if __name__ == '__main__': N = 10000 ### 무작위시행 횟수 정의 x = np.random.random([N, 2]) distance = np.sum(x ** 2.0, axis=1) in_out = distance <= 1.0 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 번하는 코드 입니다. 다음 포스팅에서는 좀 더 일반적인 문제를 파이썬 프로그래밍을 통해서 풀어 봅니다. https://studyingrabbit.tistory.com/34 728x90

몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 모든 답변

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

Top 6 몬테카를로 시뮬레이션 예제 51 Most Correct Answers

몬테칼로 시뮬레이션이란?

몬테칼로 시뮬레이션이란?

ì˜ˆì œ: ëª¬í Œ 카를로 ì‹œë®¬ë ˆì´ì ˜

Article author: support.ptc.com

Reviews from users: 20306 Ratings

Ratings Top rated: 3.2

Lowest rated: 1

Summary of article content: Articles about ì˜ˆì œ: ëª¬í Œ 카를로 ì‹œë®¬ë ˆì´ì ˜ 예제: 몬테 카를로 시뮬레이션. montecarlo 함수를 사용하여 함수를 시뮬레이션하는 난수 표본을 생성합니다. 1. 시뮬레이션할 함수를 정의합니다. …

Most searched keywords: Whether you are looking for ì˜ˆì œ: ëª¬í Œ 카를로 ì‹œë®¬ë ˆì´ì ˜ 예제: 몬테 카를로 시뮬레이션. montecarlo 함수를 사용하여 함수를 시뮬레이션하는 난수 표본을 생성합니다. 1. 시뮬레이션할 함수를 정의합니다.

Table of Contents:

ì˜ˆì œ: ëª¬í Œ 카를로 ì‹œë®¬ë ˆì´ì ˜

Read More

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드)

Article author: studyingrabbit.tistory.com

Reviews from users: 27783 Ratings

Ratings Top rated: 4.3

Lowest rated: 1

Summary of article content: Articles about 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드) 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드). 공부하는박사곰 2021. 8. 12. 13:12. …

Most searched keywords: Whether you are looking for 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드) 몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드). 공부하는박사곰 2021. 8. 12. 13:12. 몬테카를로 시뮬레이션(혹은 알고리듬)이란 무엇인지를 정의하기란 매우 어려운데, 그 이유는 이 방법론을 수학과 응용수학 분야에서 매우 광범위하게 사용하기 때문입니다. (1 )이 시뮬레이션을 이용하여 계산 하..

Table of Contents:

태그

‘수학’ Related Articles

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드)

Read More

몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제

Article author: hongl.tistory.com

Reviews from users: 33623 Ratings

Ratings Top rated: 4.4

Lowest rated: 1

Summary of article content: Articles about 몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제 [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (1) – 파이 계산하기 쇼핑몰을 운영하는 온라인 판매자가 있습니다. …

Most searched keywords: Whether you are looking for 몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제 [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (1) – 파이 계산하기 쇼핑몰을 운영하는 온라인 판매자가 있습니다. [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (1) – 파이 계산하기 쇼핑몰을 운영하는 온라인 판매자가 있습니다. 애널리틱스를 통해 분석해보니 하루에 접속하는 사람이 평균 976명이고 표전편차는..

Table of Contents:

태그

‘알고리즘 & 코딩테스트알고리즘’ Related Articles

티스토리툴바

몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제

Read More

Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 : 네이버 블로그

Article author: m.blog.naver.com

Reviews from users: 31190 Ratings

Ratings Top rated: 3.5

Lowest rated: 1

Summary of article content: Articles about Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 : 네이버 블로그 Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 · 정답은 어디까지나 참고용입니다. · 주의: 인터넷에 나머지 연산(%)으로 난수의 범위를 조정 … …

Most searched keywords: Whether you are looking for Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 : 네이버 블로그 Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 · 정답은 어디까지나 참고용입니다. · 주의: 인터넷에 나머지 연산(%)으로 난수의 범위를 조정 …

Table of Contents:

카테고리 이동

홍정모 연구소

이 블로그

CC++ 프로그래밍

카테고리 글

카테고리

이 블로그

CC++ 프로그래밍

카테고리 글

Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답 : 네이버 블로그

Read More

몬테카를로 시뮬레이션(Monte Carlo Simulation) | Python for Process Innovation

Article author: su79eu7k.github.io

Reviews from users: 44391 Ratings

Ratings Top rated: 4.0

Lowest rated: 1

Summary of article content: Articles about 몬테카를로 시뮬레이션(Monte Carlo Simulation) | Python for Process Innovation 실제 비지니스 의사결정에 손쉽게 적용할 수 있을 법한 단순한 예제를 통해 몬테카를로 시뮬레이션을 살펴봅니다. …

Most searched keywords: Whether you are looking for 몬테카를로 시뮬레이션(Monte Carlo Simulation) | Python for Process Innovation 실제 비지니스 의사결정에 손쉽게 적용할 수 있을 법한 단순한 예제를 통해 몬테카를로 시뮬레이션을 살펴봅니다. 실제 비지니스 의사결정에 손쉽게 적용할 수 있을 법한 단순한 예제를 통해 몬테카를로 시뮬레이션을 살펴봅니다.

Table of Contents:

# 몬테카를로 시뮬레이션

# 예제

# 결론

몬테카를로 시뮬레이션(Monte Carlo Simulation) | Python for Process Innovation

Read More

몬테카를로 시뮬레이션 01

Article author: velog.io

Reviews from users: 49787 Ratings

Ratings Top rated: 4.2

Lowest rated: 1

Summary of article content: Articles about 몬테카를로 시뮬레이션 01 몬테카를로 시뮬레이션을 통해 수확적 확률에 수렴 하는지 테스트를 해 보겠습니다. 코드 설명 시행에 대한 정의 부분입니다. trial := random sample {0, … …

Most searched keywords: Whether you are looking for 몬테카를로 시뮬레이션 01 몬테카를로 시뮬레이션을 통해 수확적 확률에 수렴 하는지 테스트를 해 보겠습니다. 코드 설명 시행에 대한 정의 부분입니다. trial := random sample {0, … $P(A)$에 관한 몬테카를로 시뮬레이션을 구현 하려면 다음의 3가지 원칙을 따라야 합니다.시행에 대한 시뮬레이션: 컴퓨터의 random numbers를 사용해서 model이나 translate를 구현합니다. 컴퓨터의 random numbers를 사용해서 한번 실험을

Table of Contents:

R과 함께 하는 기초 확률론

MONTE CARLO SIMULATION

Reference

몬테카를로 시뮬레이션 01

Read More

몬테카를로 시뮬레이션~ :: 미니의 꿈꾸는 독서, 그리고 프로그래밍 이야기

Article author: blog.acronym.co.kr

Reviews from users: 42249 Ratings

Ratings Top rated: 4.2

Lowest rated: 1

Summary of article content: Articles about 몬테카를로 시뮬레이션~ :: 미니의 꿈꾸는 독서, 그리고 프로그래밍 이야기 그래서 위키피디아의 원주율 파이를 구하는 예제를 통해서 설명해 보려고 한다. 원주율 파이 값을 구하기 위한 많은 수학적 알고리즘이 있다. ” … …

Most searched keywords: Whether you are looking for 몬테카를로 시뮬레이션~ :: 미니의 꿈꾸는 독서, 그리고 프로그래밍 이야기 그래서 위키피디아의 원주율 파이를 구하는 예제를 통해서 설명해 보려고 한다. 원주율 파이 값을 구하기 위한 많은 수학적 알고리즘이 있다. ” … 분석을 하면서 “몬테카를로 시뮬레이션”을 한번쯤은 들어봤을 것이다. 몬테카를로는 무작위 값을 활용하여 확률적으로 계산하는 알고리즘을 이야기한다. 이렇게 확률적으로 계산함으로써 원하는 수치의 확률적 분..몬테카를로 시뮬레이션~,웹,모바일,프로그래밍,개발,프로젝트,xml,보안,소프트웨어,블로그,html5,리뷰,web,mobile,programming,development,project,xml,html5,software,blog

Table of Contents:

몬테카를로 시뮬레이션~ :: 미니의 꿈꾸는 독서, 그리고 프로그래밍 이야기

Read More

몬테카를로 시뮬레이션 – MATLAB & Simulink

Article author: kr.mathworks.com

Reviews from users: 7361 Ratings

Ratings Top rated: 4.6

Lowest rated: 1

Summary of article content: Articles about 몬테카를로 시뮬레이션 – MATLAB & Simulink MATLAB 및 Simulink에서 몬테카를로 시뮬레이션을 수행하는 방법을 알아봅니다. 비디오와 예제를 통해 모델에 통계적 불확실성을 적용하고 시뮬레이션을 병렬로 수행 … …

Most searched keywords: Whether you are looking for 몬테카를로 시뮬레이션 – MATLAB & Simulink MATLAB 및 Simulink에서 몬테카를로 시뮬레이션을 수행하는 방법을 알아봅니다. 비디오와 예제를 통해 모델에 통계적 불확실성을 적용하고 시뮬레이션을 병렬로 수행 … MATLAB 및 Simulink에서 몬테카를로 시뮬레이션을 수행하는 방법을 알아봅니다. 비디오와 예제를 통해 모델에 통계적 불확실성을 적용하고 시뮬레이션을 병렬로 수행하는 방법을 보여줍니다.

Table of Contents:

무작위 파라미터 변형을 통해 민감도 분석 수행하기

How to Get Best Site Performance

몬테카를로 시뮬레이션 – MATLAB & Simulink

Read More

See more articles in the same category here: toplist.future-user.com/blog.

예제: 몬테 카를로 시뮬레이션

예제: 몬테 카를로 시뮬레이션 montecarlo 함수를 사용하여 함수를 시뮬레이션하는 난수 표본을 생성합니다. 1. 시뮬레이션할 함수를 정의합니다. f x y 2 x 0.5 y 2. 각 매개변수의 분포를 정의합니다. dist Normal Uniform dist 의 두 성분은 Normal Uniform 벡터의 두 성분은함수를 나타냅니다. 3. 각 분포의 평균 및 표준 편차를 정의합니다. 결과를 행렬 Rvals 에 기록합니다. μ_x 7.5 μ_y 5 σ_x 1.2 σ_y 0.84 Rvals X Y μ_x μ_y σ_x σ_y 4. 매개변수 Y 에 대한 상한값을 설정합니다. upper_limit 8.5 lim NaN NaN NaN upper_limit 5. 생성할 표본 수를 정의합니다. n 500 6. montecarlo 를 호출하여 표본을 생성합니다. M montecarlo f n Rvals dist lim montecarlo 함수로 구한 출력은 세 개의 열이 있는 행렬입니다. M 처음 두 열은 각 매개변수에서 생성된 표본입니다. 마지막 열은 이러한 매개변수가 적용된 함수 f 의 출력입니다. 7. 생성된 값을 별도의 벡터에 기록합니다. i 0 rows M 2 X1 i M i 1 0 Y1 i M i 1 1 R1 i M i 1 2 마지막 벡터 R1 이 함수 f 의 출력인지 확인할 수 있습니다. R1 0 f X1 0 Y1 0 8. 매개변수 간의 관계를 도표화하고 해당 평균을 도표화합니다. X_mean μ_x μ_x range_y 0 9 Y_mean μ_y μ_y range_x 3.5 11.5 lines lines lines 9 X1 range_x X_mean 3.5 4.5 11.5 11 Y1 Y_mean range_y 0 9 표본이 Y축에 대해 균일하게 분포되어 있으며 X축에 대해 정규 분포를 보입니다. y 값이 8.5 이상인 표본은 무시됩니다. 9. histogram y 값을 10개의 빈(bin)으로 분리합니다. y 값의 히스토그램을 도표화합니다. 을 호출하여값을 10개의 빈(bin)으로 분리합니다.값의 히스토그램을 도표화합니다. H_Y histogram 10 Y1 columns 9 H_Y 0 0 1 8 11 H_Y 1 0 y 값이 균일하게 분포되어 있습니다. 표본은 평균을 중심으로 양쪽에 6시그마를 생성합니다. μ_y width σ_y 6 LB UB μ_y width μ_y width 생성된 표본이 상한값보다 큰 경우 무시됩니다. upper_limit 10. histogram 을 호출하여 x 값을 10개의 빈(bin)으로 분리합니다. y 값의 히스토그램을 도표화하고 정규 분포를 추가합니다. H_X histogram 12 X1 h 0 rows H_X 1 Norm h dnorm H_X h 0 μ_x σ_x columns lines 9 H_X 0 3.5 4.5 11.5 11 H_X 1 Norm 0.004 x 값이 정규 분포됩니다. 11. 각 매개변수에 대한 결과를 도표화합니다. lines 9 X1 3.5 4.5 11.5 10 R1 26 lines 10 Y1 0 1 9 10 R1 26 12. 특수 구문 if NaN 으로 바꿉니다. 특수 구문를 호출하여 제약 조건을 정의하고 제약 조건을 충족하지 못하는 결과를으로 바꿉니다. j 0 2 p i j if X1 i Y1 i 14 M i 1 j NaN q i j if X1 i 2 2 Y1 i 75 p i j NaN 13. 매개변수 간의 관계를 도표화합니다. X2 q 0 Y2 q 1 R2 q 2 lines 9 X2 3.5 4.5 11.5 11 Y2 0 14. 각 매개변수에 대한 결과를 도표화합니다. lines 9 X2 3.5 4.5 11.5 10 R2 26 lines 10 Y2 0 1 9 10 R2 26 식 복사

몬테 카를로 시뮬레이션(Monte Carlo Simulation) 의 이해 : 원주율값 구하기 (+파이썬 시뮬레이션 코드)

몬테카를로 시뮬레이션(혹은 알고리듬)이란 무엇인지를 정의하기란 매우 어려운데, 그 이유는 이 방법론을 수학과 응용수학 분야에서 매우 광범위하게 사용하기 때문입니다. (1 )이 시뮬레이션을 이용하여 계산 하려는 대상(값) (2) 이 시뮬레이션을 이용해야 하는 이유 (2) 이 시뮬레이션의 전체 혹은 일부를 이용하는 방법 등에 따라서, 몬테 카를로 시뮬레이션에 대한 정의는 조금씩 다를 텐데요, 그러나 이 방법론을 사용하는 모든 경우를 아우를 수 있는 핵심점인 키워드는 “반복적인 무작위적 샘플링” 입니다. 위키피디아의 몬테 카를로 시뮬레이션을 소개하는 첫 문장은 Monte Carlo methods, or Monte Carlo experiments, are a broad class of computational algorithms that rely on repeated random sampling to obtain numerical results. The underlying concept is to use randomness to solve problems that might be deterministic in principle. 입니다. 우리 말로 적당히 번역하면 광범위한 계산 알고리듬의 일종인데, 특히 반복적인 랜덤 샘플링에 의존하여 결과를 얻는 것. 문제를 풀기 위해 (그 문제가 결정론적인 원리라고 하더라도) 무작위성을 이용한다 가 중요한 부분이 될 것 입니다. 보통 알고리듬이라고 하면, “주어진 절차에 따라서 기계적인 방식으로 문제를 해결” 하는 것을 떠올리는데 여기에는 무작위성이 파고 들어갈 공간이 없습니다. 그러나 몬테 카를로 시뮬레이션에서는 무작위성이 핵심적인 역할을 하게 됩니다. 이렇게 저렇게 설명을 길게 하는 것 보다는 간단하긴 하지만 핵심적인 시뮬레이션을 하나 해 보면서 몬테 카를로 시뮬레이션이 무엇인지를 “느껴” 보는 것이 더 중요한 것 같습니다. 몬테 카를로 시뮬레이션 설명에서 꼭 나오는 “원주율값 구하기”를 해 보면서 몬테 카를로 시뮬에이션이 어떻게 사용될 수 있고, 기존의 다른 알고리듬 대비 얼마나, 혹은 어떻게 그 효율성을 줄 수 있는지를 알아 보도록 하겠습니다. 원주율값 $\pi$ = 반지름이 1인 원의 넓이 라는 것에 착안하여 반지름이 1인 원의 넓이를 시뮬레이션의 방법을 통해 정확히 구하면 원주율 $\pi$를 구할 수 있습니다. 넓이를 구하는 것이니, 적분을 하면 될텐데요. 반지름의 길이가 1인 원의 방정식은 $x^2 + y^2 =1$ 이므로, 원이 넓이는 $x^2 + y^2 <1$ 인 영역의 넓이를 구하는 것과 같습니다. 이 식을 $y$에 대한 식으로 바꾸면 $y = \sqrt{1-x^2}$ 이므로, 원의 넓이 이면서 원주율 값은 $$S = \pi = 4\int_{0}^{1}\sqrt{1-x^2}dx$$ 이 됩니다. 1사분면에서 넓이를 계산하고 여기에 곱하기 4를 해 준것 입니다. 이 적분은 역삼각함수를 이용하면 부정적분을 구할 수 있고, 간단하게 값이 $\pi$가 된다는 것을 알 수 있습니다. 따라서, 시뮬레이션적인 방법을 통해서 원의 넓이 (혹은 1사 분면에서의 원의 넓이)를 구하면 원주율 값을 구할 수 있다는 결론을 얻습니다. 즉, 적분을 해야합니다. 무작위로 점을 찍는 방법을 통해 넓이를 구하자 1사분면에 원을 그렸습니다. 원의 내부는 빨간색, 원의 외부는 파란색으로 칠했습니다. 우리의 목표는 빨간색 부분의 넓이를 구하는 것 입니다. 물론 구분구적법을 통해서 구해도 되지만, 이번에는 다른 방법을 통해서 구해보도록 하겠습니다. 가로 세로의 길이가 1인 정사각형안에 한 점을 무작위적으로 고른다면, 그 점이 붉은색이 될 확률과 파란색이 될 확률은 붉은색 영역의 넓이와 푸른색 영역의 넓이의 비율과 같을 것 입니다. 그런데 여기서 전체 넓이는 1이기 때문에, 붉은색 영역이 선정될 확률 = 붉은색 영역의 넓이 = 반지름이 1인 원의 넓이의 $1/4$ = $\pi/4$ 가 됩니다. 즉, 우리가 무작위적으로 한 점을 선택했을 때, 이 점이 붉은색 영역에 속한 점이 될 확률을 정확히 원주율이 $1/4$이 됩니다. 따라서, 만일 우리가 무작위적으로 점을 선택(찍는) 과정을 반복한다면 확률의 큰수 법칙에 따라서 전체 점의 갯수 중에서 빨간색 영영역의 점의 갯수의 비율은 정확히 $\pi/4$가 될 것 입니다. 이를 수식적으로 정확하게 표현하면, $$\pi/4 = \frac{\text{선택된점이 빨간색 영역에 속하는 횟수}}{\text{무작위적으로 한 점을 고르는 횟수}}$$ 가 됩니다. 여기에서의 가정은 무작위적으로 고르는 시행이 가로 세로 길이가 1인 정사각형의 모든 점을 정말로 무작위적이고 고르게 뽑아야 한다는 것 입니다. 특정 영역에 점을 많이 뽑거나 혹은 반대로 특정 영역의 점을 적게 뽑는다면 위 방법을 통해서 계산한 원주율 값은 우리가 알고 있는 원주율값과 많이 다를 것 입니다. 또한, 위 과정을 매우 많이 반복해야만 실제 원주율 값과 비슷한 값을 얻을 수 있을 것 입니다. 프로그래밍을 통해서 무작위로 점을 찍어 보자 파이썬 프로그래밍을 통해서 위 영역에서 100개의 점을 무작위로 선택했고, 이 점이 원이 내부에 있는경우에는 빨간색으로, 원의 외부에 있는 경우에는 파란색으로 표시하였습니다. 완전히 고르게 퍼져 있는 것은 아니지만, 점들이 나름대로는 넓게 잘 펼쳐져 있는 것 같습니다. 위의 구체적인 예시에서는 빨간점 : 81개 파란점 : 19개 를 얻었고, 따라서 위 식에 대입하면 $\pi = 4 \frac{81}{100} = 3.24$ 값을 얻게 됩니다. 실제 $\pi$값과는 좀 다르지만 그런대로 괜찮은 값을 얻은 것 같습니다. 앞서 언급한대로 시행의 횟수를 키워야 좀 더 정확한 넓이의 비율을 구할 수 있기 때문에, 시행의 횟수N 를 1000, 10000, 100000으로 늘려 보겠습니다. 영상으로 보면 더 이해하기 쉬운데요, https://youtu.be/SV41AeVk_Oc 결과는 위와 같습니다. 각 경우 구해진 $\pi$값은 N = 1000 : 3.12 N =10000 : 3.1308 N =100000 : 3.137 로 N이 증가하면 증가할 수록 원주율값과 차이가 줄어듦을 알 수 있습니다. 위 시뮬레이션에서는 각 시행 횟수 마다 단 한 번의 실험을 한 것 인데요, 이걸 여러번 반복해 보면 좀 더 정확한 결과를 얻을 수 있지 않을까요? 위 그래프는 각 시행횟수 N 마다 100번의 반복된 실험을 한 결과를 보여주고 있습니다. X축은 1, 2, 3, 4, 5 값을 갖는데 각각 시행 횟수 N = 10, 100, 1000, 10000, 10000 를 의미합니다. 10의 거듭 제곱의 값 입니다. Y 축은 각 시행에서 얻어진 원주율 값 입니다. 이 결과를 보면 "N이 커질 수록 각 시행의 값이 실제 원주율값에 가깝에 얻어지고, 각 시행의 편차가 작아진다" 를 확인할 수 있습니다. 이는 확률과 통계에 대한 우리의 기본적인 직관과 일치합니다. 더 많은 시행을 할 수록 주어진 확률에 수렴하는 것 입니다. 실제로 이 시행은 이항 분포를 통해서 설명할 수 있습니다. 한 점을 무작위로 선택했을 때, 빨간점 혹은 파란점이 선택되면서 (우리가 관심이 있는) 빨간색이 될 확률을 $\pi/4$가 됩니다. 그래서 시행횟수를 N이라 했을 때, 빨간점이 나오는 확률은 이항 분포 $B(N, \pi/4)$가 됩니다. 따라서 빨간점의 기대값은 $N \frac{\pi}{4}$ 이고, 표준편차는 $\sqrt{N \frac{\pi}{4} (1-\frac{\pi}{4} )}$가 됩니다. 최종적으로 구하고 싶은 원주율값은 빨간점의 기대값에 4를 곱하고 N으로 나누는 것이니 시뮬레이션을 통해서 구해지는 원주율값의 표준편차는 $\frac{1}{\sqrt{N}}$에 비례하게 됩니다. 각 시행횟수 N 마다 100번씩 반복 실험한 위 결과가 이항 분포의 성질에 부합됨을 알 수 있습니다. 요약하면, 위와 같이 시행횟수 N을 매우 크게 하면, 원주율값과 매우 유사한 결과를 얻을 수 있고, 이때의 에러(실제 원주율 값과 시뮬레이션을 통해 얻은 원주율 값이 차이)는 $\frac{1}{\sqrt{N}}$에 비례하게 됩니다. 넓이는 그냥 구분 구적법을 통해서 구하면 되는게 아닌가? 위 방법을 통해 원주율 값을 계산한 과정을 다시 한 번 살펴보면, 구분구적법을 통해서 넓이를 구하지 않고 무작위적인 점찍기 방법을 통해서 붉은색 영역의 넓이를 구했다는 것을 발견할 수 있습니다. 앞서 언급했지만, 붉은 영역의 넓이를 정확하게 구하기 위해서는 구분구적법을 하면 됩니다. 구분구적법은 매우 간단한 알고리듬이라서 설명은 생략하고 바로 결과만을 제시하면, 위 그래프와 같습니다. 구분구적법에서는 [0, 1] 사이를 많은 조각으로 나누는데, 위 그래프의 x축은 몇 조각으로 나누었는지에 대한 값입니다. 앞의 그래프에서와 같이 위 값은 10의 거듭제곱값으로 1, 2, 3, 4, 5는 각각 10, 100, 1000, 10000, 100000 조각으로 나누어서 구분구적법을 계산한 것 입니다. 100000 조각으로 나누어서 계산한 원주율 값은 3.141612로 우리가 알고 있는 원주율값 3.141592와 매우 유사합니다. 이처럼 구분구적법을 통해서 계산을 하면, 몬테 카를로 시뮬레이션을 통해 계산을 하는 것에 비해서 (1) 프로그래밍 코드를 만들기 쉬움 (2) 같은 시행 횟수를 하더라도 몬테 카를로 시뮬레이션 대비 더 정확한 계산을 할 수 있음 몬테 카를로 계산으로 100000번 무작위 선정을 한 경우 원주율 값 : 3.137 구분구적법으로 100000번 나누어 계산한 원주율 값 : 3.142 와 같은 장점이 있습니다. (2)를 조금 더 상세하게 설명하면, 구간 [0, 1]를 N 조각 하여 계산하는 경우, 구분구적법과 몬테 카를로 시뮬레이션 모두 N에 비례하는 계산량이 필요합니다. 이때 에러는 구분구적법의 경우 $\frac{1}{N}$에 비례하게 되고, 몬테 카를로 시뮬레의 경우 $\frac{1}{\sqrt{N}}$에 비례 하게 됩니다. N이 커지면 구분구적법의 에러가 훨씬 더 작아지는 것 입니다. 그렇기 때문에 위와 같은 결과가 얻어진 것 입니다. 위 (1), (2)를 보면 구분구적법 대비 몬테 카를로 시뮬레이션의 장점이 없는 것 같은데, 굳이 왜 몬테 카를로 시뮬레이션을 하는 것 일까요? 차원이 높아진다면 어떨까? 우리가 다루는 원주율값을 구하는 구체적인 문제에서는 적분을 해야하는 차원은 1차원이었습니다. 즉 $y = f(x)$에서 $x \in R^1$, $y \in R^1$ 이었습니다. 만일 적분을 해야하는 차원이 1차원이 아닌 일반적인 $D$ 차원이라면 (즉, $x$가 실수가 아닌 일반적인 $D$ 차원의 벡터) 어떻게 될까요? 동일한 정도의 에러를 갖는 답을 얻기 위해서, 구분구적법과 몬테 카를로 시뮬레이션에서 몇 번의 계산을 해야하는지를 알아 보겠습니다. 구체적인 예를 들어 $1/1000 = 10^{-3}$ 만큼의 에러를 갖는 값을 계산해야 한다고 생각하겠습니다. 몬테 카를로 계산의 경우 N번 무작위 선택 계산을 할 때, 오차가 $\frac{1}{\sqrt{N}}$에 비례 하기 때문에 무작위 선택 계산을 $10^6$ 번 해야합니다. 구분구적법의 경우 각 차원의 영역을 N 등분 할 때, 오차가 $\frac{1}{N}$이 되기 때문에 영역 등분을 $10^3$ 만큼 해야합니다. 따라서 차원이 $D$라면, 전체 공간에서 그리드의 갯수는 $10^{3D}$ 가 되고, 계산량은 이에 비례해 증가 합니다. 정리하면 몬테 카를로 : $10^{6}$, 즉 변화가 없음 구분구적법 : $10^{3D}$, 차원 $D$에 지수적으로 증가 가 됩니다. 1차원에서는 구분구적법이 유리하고(계산량이 더 적고), 2차원에서는 동일하며, 3차원 이상에서는 몬테 카를로 시뮬레이션이 더 유리합니다. 이 점이 매우 중요합니다! 몬테 카를로 시뮬레이션의 이 같은 장점은 $x$의 차원이 커지면 커질수록 극명해 지는데요, 만일 $D=10$ 이라고 한다면 몬테 카를로 시뮬레이션의 계산량은 $10^{6}$ 로 변함이 없지만, 구분구적법의 경우 $10^{30}$이나 됩니다. 현존하는 슈퍼 컴퓨터를 동원하더라도 계산이 불가능할 정도로 계산량이 늘어 납니다. 물론 좀 더 효율적인 구분구적법 알고리듬을 사용한다면 계산량을 줄일 수 있습니다. 하지만, 차원이 높아짐에 따라서 계산량이 지수적으로 증가하는 현상은 피할 수 없습니다. 정리 위 구체적인 예시, 그리고 구분구적법과의 비교를 통해서 몬테 카를로 시뮬레이션이 어떻게 수행 되는지, 그리고 다른 시뮬레이션(알고리듬)과의 차이가 무엇인지를 알아보았습니다. 요약하면 몬테 카를로 시뮬레이션은 (1) 무작위 샘플링(위 예시에서는 무작위로 점을 찍는 것)의 반복을 통해서 원하는 값을 얻는다 (2) 구분구적법과 같이 모든 경우를 전부 계산 하는 방법과 비교하면, 공간 차원이 커질 수록 몬테 카를로 계산이 우월해 진다 (동일한 오차의 값을 얻기 위한 계산량이 적어 진다) 의 성질을 갖습니다. 추가적인 포스팅을 통해서, 구체적인 활용에서 위 두 성질이 어떻게 이용되는지를 알아 보도록 하겠습니다. 파이썬 시뮬레이션 코드 아래는 위 계산에서 사용된 파이썬 시뮬레이션 코드 입니다. 파이썬을 활용할 줄 안다면, 아래 코드를 복-붙 하여 사용할 수 있습니다. # 필요한 라이브러리 불러오기 import numpy as np from multiprocessing import Pool from matplotlib import pyplot as plt if __name__ == '__main__': N = 10000 ### 무작위시행 횟수 정의 x = np.random.random([N, 2]) distance = np.sum(x ** 2.0, axis=1) in_out = distance <= 1.0 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 번하는 코드 입니다. 다음 포스팅에서는 좀 더 일반적인 문제를 파이썬 프로그래밍을 통해서 풀어 봅니다. https://studyingrabbit.tistory.com/34 몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제 반응형 [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (1) – 파이 계산하기 쇼핑몰을 운영하는 온라인 판매자가 있습니다. 애널리틱스를 통해 분석해보니 하루에 접속하는 사람이 평균 976명이고 표전편차는 352인 가우스 분포를 가짐을 알았습니다. 또한, 재고가 있을 때는 5% 확률로 구매하고 재고가 없을 때는 2% 확률로 구매한다는 것 또한 알았습니다. (재고가 없으면 당연히 물건을 팔 수 없겠지만 예제이니 재고가 없어도 물건을 팔 수 있다고 가정합니다.) 판매자는 개당 100달러인 물건의 재고를 $N$개를 유지하고 한 개의 재고를 유지하는데 하루에 30달러를 지불합니다. (업무 종료 시에 한 번에 지불합니다.) 그렇다면 판매자의 평균 일일 수입을 최대화하는 최적의 재고 개수 $N$값은 얼마일까요? 이러한 문제는 수식으로 만들기도 애매하지만 난수 생성을 통해 몬테카를로 시뮬레이션을 할 수 있습니다. 하루에 얻을 수 있는 기대 수익을 시뮬레이션하고 이를 기반으로 여러 일에 대해 반복적으로 시뮬레이션 하면 되겠죠. 물건의 재고가 있으면 방문자는 5% 확률로 물건을 구매하고 수입은 70달러가 될 것이고 재고가 없으면 방문자는 2% 확률로 물건을 구매하고 수입은 100달러가 될 것입니다. 먼저 하루에 얻을 수 있는 수익을 계산해 보겠습니다. from random import gauss, random def simulate_once(N): profit = 0 loss = 30*N instock = N for i in range(int(gauss(976, 352))): if instock > 0: if random() < 0.05: instock -= 1 profit += 100 else: if random() < 0.02: profit += 100 return profit - loss random.gauss 함수로 주어진 평균과 표준편차로 정의된 가우스 분포에서 값을 샘플링합니다. 즉, 표준편차가 352이고 976에 중심을 둔 가우스 분포에서 하루 방문자 수를 샘플링하는 것이죠. random.random 함수를 [0,1] 사이의 값을 균등하게 뽑아내는 함수입니다. 이제 위의 "simulate_once" 함수를 시뮬레이션 일수 $d$ 만큼 반복적으로 계산합니다. 밑의 코드에서는 $d=1000$ 으로 고정시키고 $N$의 값을 10만큼 증가시키면서 평균 수입을 계산합니다. 시뮬레이션 결과로 보아 최적의 재고 품건 개수를 대략 40개 정도임을 알 수 있습니다. 당연히 시뮬레이션 성능을 향상시키려면 $d$나 $N$을 늘리면 되겠죠. def simulate_many(N, ap=1, rp=0.01, d=1000): s = 0. for k in range(1, d): x = simulate_once(N) s += x mu = s/k if k > 10 and mu – mu_old < max(ap, rp*mu): return mu else: mu_old = mu raise ArithmeticError('no convergence') for N in range(0, 100, 10): print(N, simulate_many(N)) >>> 0 2281.818181818182 10 1709.090909090909 20 2281.818181818182 30 2641.6666666666665 40 2666.6666666666665 50 2516.6666666666665 60 2115.3846153846152 70 2718.181818181818 80 1483.3333333333333 90 1572.7272727272727 ap는 absolute precision, rp는 relative precision을 뜻합니다. 수렴의 조건을 ap와 rp로 정하고 평균과 직전 평균의 차이가 ap보다 작거나 혹은 현재 평균의 rp 보다 작다면 수렴했다고 가정해서 루프 문을 멈춥니다. 만약, ap, rp 값을 낮춘다면 시뮬레이션의 수렴 조건을 더 빡빡하게 잡는다는 것이고 이럴 경우에는 $d$값이 ap, rp에 비해 상대적으로 작다면 수렴을 안 할 수도 있습니다. 이 예제로부터 알 수 있는 몬테카를로 시뮬레이션의 기본 구성 요소는 다음과 같습니다. 시스템을 한 번 시뮬레이션하고 확률 변수 (예제에서는 가우스 확률 변수)를 사용하여 미지의 양 (하루 수익)을 모델링하는 함수 (simulate_once) 시뮬레이션을 여러 차례 반복해서 평균을 계산하는 함수 (simulate_many) 정리하면, 몬테카를로 시뮬레이션은 1) 난수 생성기, 2) 난수 생성기를 사용하여 시스템을 한 번 시뮬레이션하는 함수, 3) 앞의 시뮬레이션을 반복해서 호출하고 시뮬레이션 값의 평균이 수렴할 때까지 결과의 평균을 계산하는 함수, 4) 결과의 정확도를 추산하고 시뮬레이션 결과가 수렴하여 정지하는 때를 결정하는 함수 ($\delta\mu$가 정밀도 (ap, rp) 보다 작은지) 로 구성됩니다. [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (3) – 부트스트랩 알고리즘 (bootstrap) [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (4) – 범용 몬테카를로 엔진 [알고리즘 & 코딩테스트/알고리즘] – 몬테카를로 시뮬레이션 (5) – 적분 계산하기 반응형

So you have finished reading the 몬테카를로 시뮬레이션 예제 topic article, if you find this article useful, please share it. Thank you very much. See more: 몬테카를로 시뮬레이션 엑셀, 몬테카를로 시뮬레이션 파이썬, 몬테카를로 시뮬레이션 물리, 몬테카를로 시뮬레이션 프로그램, 몬테카를로 시뮬레이션 단점, 몬테카를로 시뮬레이션 매트랩, 몬테카를로 시뮬레이션 개념, 몬테카를로 시뮬레이션 인공지능

몬테카를로 시뮬레이션 (2) – 온라인 판매자 예제

반응형

몬테카를로 시뮬레이션 (1) – 파이 계산하기

쇼핑몰을 운영하는 온라인 판매자가 있습니다. 애널리틱스를 통해 분석해보니 하루에 접속하는 사람이 평균 976명이고 표전편차는 352인 가우스 분포를 가짐을 알았습니다. 또한, 재고가 있을 때는 5% 확률로 구매하고 재고가 없을 때는 2% 확률로 구매한다는 것 또한 알았습니다. (재고가 없으면 당연히 물건을 팔 수 없겠지만 예제이니 재고가 없어도 물건을 팔 수 있다고 가정합니다.) 판매자는 개당 100달러인 물건의 재고를 $N$개를 유지하고 한 개의 재고를 유지하는데 하루에 30달러를 지불합니다. (업무 종료 시에 한 번에 지불합니다.) 그렇다면 판매자의 평균 일일 수입을 최대화하는 최적의 재고 개수 $N$값은 얼마일까요?

이러한 문제는 수식으로 만들기도 애매하지만 난수 생성을 통해 몬테카를로 시뮬레이션을 할 수 있습니다. 하루에 얻을 수 있는 기대 수익을 시뮬레이션하고 이를 기반으로 여러 일에 대해 반복적으로 시뮬레이션 하면 되겠죠. 물건의 재고가 있으면 방문자는 5% 확률로 물건을 구매하고 수입은 70달러가 될 것이고 재고가 없으면 방문자는 2% 확률로 물건을 구매하고 수입은 100달러가 될 것입니다. 먼저 하루에 얻을 수 있는 수익을 계산해 보겠습니다.

from random import gauss, random def simulate_once(N): profit = 0 loss = 30*N instock = N for i in range(int(gauss(976, 352))): if instock > 0: if random() < 0.05: instock -= 1 profit += 100 else: if random() < 0.02: profit += 100 return profit - loss random.gauss 함수로 주어진 평균과 표준편차로 정의된 가우스 분포에서 값을 샘플링합니다. 즉, 표준편차가 352이고 976에 중심을 둔 가우스 분포에서 하루 방문자 수를 샘플링하는 것이죠. random.random 함수를 [0,1] 사이의 값을 균등하게 뽑아내는 함수입니다. 이제 위의 "simulate_once" 함수를 시뮬레이션 일수 $d$ 만큼 반복적으로 계산합니다. 밑의 코드에서는 $d=1000$ 으로 고정시키고 $N$의 값을 10만큼 증가시키면서 평균 수입을 계산합니다. 시뮬레이션 결과로 보아 최적의 재고 품건 개수를 대략 40개 정도임을 알 수 있습니다. 당연히 시뮬레이션 성능을 향상시키려면 $d$나 $N$을 늘리면 되겠죠. def simulate_many(N, ap=1, rp=0.01, d=1000): s = 0. for k in range(1, d): x = simulate_once(N) s += x mu = s/k if k > 10 and mu – mu_old < max(ap, rp*mu): return mu else: mu_old = mu raise ArithmeticError('no convergence') for N in range(0, 100, 10): print(N, simulate_many(N)) >>> 0 2281.818181818182 10 1709.090909090909 20 2281.818181818182 30 2641.6666666666665 40 2666.6666666666665 50 2516.6666666666665 60 2115.3846153846152 70 2718.181818181818 80 1483.3333333333333 90 1572.7272727272727

ap는 absolute precision, rp는 relative precision을 뜻합니다. 수렴의 조건을 ap와 rp로 정하고 평균과 직전 평균의 차이가 ap보다 작거나 혹은 현재 평균의 rp 보다 작다면 수렴했다고 가정해서 루프 문을 멈춥니다. 만약, ap, rp 값을 낮춘다면 시뮬레이션의 수렴 조건을 더 빡빡하게 잡는다는 것이고 이럴 경우에는 $d$값이 ap, rp에 비해 상대적으로 작다면 수렴을 안 할 수도 있습니다.

이 예제로부터 알 수 있는 몬테카를로 시뮬레이션의 기본 구성 요소는 다음과 같습니다.

시스템을 한 번 시뮬레이션하고 확률 변수 (예제에서는 가우스 확률 변수)를 사용하여 미지의 양 (하루 수익)을 모델링하는 함수 (simulate_once) 시뮬레이션을 여러 차례 반복해서 평균을 계산하는 함수 (simulate_many)

정리하면, 몬테카를로 시뮬레이션은 1) 난수 생성기, 2) 난수 생성기를 사용하여 시스템을 한 번 시뮬레이션하는 함수, 3) 앞의 시뮬레이션을 반복해서 호출하고 시뮬레이션 값의 평균이 수렴할 때까지 결과의 평균을 계산하는 함수, 4) 결과의 정확도를 추산하고 시뮬레이션 결과가 수렴하여 정지하는 때를 결정하는 함수 ($\delta\mu$가 정밀도 (ap, rp) 보다 작은지) 로 구성됩니다.

몬테카를로 시뮬레이션 (3) – 부트스트랩 알고리즘 (bootstrap)

몬테카를로 시뮬레이션 (4) – 범용 몬테카를로 엔진

몬테카를로 시뮬레이션 (5) – 적분 계산하기

반응형

Monte Carlo Simulation 몬테 카를로 시뮬레이션 예제 정답

Computational Finance [2/2]

Monte Carlo Simulation

정답은 어디까지나 참고용입니다. 입력과 출력이 동일하다면 스스로 작성한 코드도 좋은 답입니다.

주의: 인터넷에 나머지 연산(%)으로 난수의 범위를 조정하는 트릭이 많이 돌아다니는데 예제로 제시한 방법보다 정밀도 (유효숫자의 크기)가 많이 떨어집니다. 예를 들어서 rand%6을 사용한다면 생성되는 숫자가 0, 1, 2, 3, 4, 5 뿐입니다.

이정도 배운 것으로는 로또 점수나 주가를 예측할 수는 없습니다. 의도는 좋으나 몇 년 더 공부하고 시도하세요.

Step 1. Random Number (난수) 생성해보기

RAND_MAX 32767

srand(time(null)); // 시간으로부터 seed값 생성

#include #include #include double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } void main() { srand((unsigned int)time(NULL)); for (int i = 0; i < 5; i++) { printf("%f ", getRandomNumber(1.0, 2.0)); } } Step 2. Generate random numbers to fill a square #include #include #include double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } void main() { FILE *of = fopen("square.txt", "w"); srand((unsigned int)time(NULL)); for (int i = 0; i < 10000; i++) { double x = getRandomNumber(0.0, 1.0); double y = getRandomNumber(0.0, 1.0); fprintf(of, "%f, %f ", x, y); } fclose(of); } File output Draw with Excel Keywords: function, domain {} Step 3. Generate a random number to fill a circle #include #include #include #include double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } bool isInsideCircle(const double x, const double y) { const double x_c = 0.5; const double y_c = 0.5; const double r = 0.5; const double f = (x - x_c)*(x - x_c) + (y - y_c)*(y - y_c) - r * r; if (f > 0.0) return false; else return true; } void main() { FILE *of = fopen(“circle.txt”, “w”); srand((unsigned int)time(NULL)); for (int i = 0; i < 10000; i++) { double x = getRandomNumber(0.0, 1.0); double y = getRandomNumber(0.0, 1.0); if(isInsideCircle(x, y) == true) fprintf(of, "%f, %f ", x, y); } fclose(of); } Keywords: bool type (stdbool.h) Step 4. Monte Carlo Simulation으로 원주율 계산하기 #include #include #include #include double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } bool isInsideCircle(const double x, const double y) { const double x_c = 0.5; const double y_c = 0.5; const double r = 0.5; const double f = (x - x_c)*(x - x_c) + (y - y_c)*(y - y_c) - r * r; if (f > 0.0) return false; else return true; } void main() { srand((unsigned int)time(NULL)); const int num_pts_square = 1000; int num_pts_circle = 0; for (int i = 0; i < num_pts_square; i++) { double x = getRandomNumber(0.0, 1.0); double y = getRandomNumber(0.0, 1.0); if (isInsideCircle(x, y) == true) { num_pts_circle++; } } const double pi_mc = 4.0 * num_pts_circle / num_pts_square; printf("Estimated pi with %d random pts is %f ", num_pts_square, pi_mc); } 2중 for문 사용해서 sample 수 증가에 따른 변화 점검 #include #include #include #include double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } bool isInsideCircle(const double x, const double y) { const double x_c = 0.5; const double y_c = 0.5; const double r = 0.5; const double f = (x - x_c)*(x - x_c) + (y - y_c)*(y - y_c) - r * r; if (f > 0.0) return false; else return true; } void main() { FILE *of = fopen(“pi_mc.txt”, “w”); srand((unsigned int)time(NULL)); for (int num_pts_square = 10; num_pts_square < 100000000; num_pts_square *= 2) { int num_pts_circle = 0; for (int i = 0; i < num_pts_square; i++) { double x = getRandomNumber(0.0, 1.0); double y = getRandomNumber(0.0, 1.0); if (isInsideCircle(x, y) == true) { num_pts_circle++; } } const double pi_mc = 4.0 * num_pts_circle / num_pts_square; printf("Estimated pi with %d random pts is %f ", num_pts_square, pi_mc); fprintf(of, "%f ", pi_mc); } fclose(of); } Result converges (수렴) to real PI number 2중 for문의 안쪽을 함수로 옮겨주면서 함수의 선언declaration과 정의definition를 분리 함수 선언은 사용되기 전에 이뤄져야 함. 선언만 되고 body가 없으면 링킹 에러 발생 #include #include #include #include double getRandomNumber(const double min, const double max); bool isInsideCircle(const double x, const double y); double estimatePI(const int num_pts_square) { int num_pts_circle = 0; for (int i = 0; i < num_pts_square; i++) { double x = getRandomNumber(0.0, 1.0); double y = getRandomNumber(0.0, 1.0); if (isInsideCircle(x, y) == true) { num_pts_circle++; } } const double pi_mc = 4.0 * num_pts_circle / num_pts_square; return pi_mc; } void main() { FILE *of = fopen("pi_mc.txt", "w"); srand((unsigned int)time(NULL)); for (int num_pts_square = 10; num_pts_square < 100000000; num_pts_square *= 2) { const double pi_mc = estimatePI(num_pts_square); printf("Estimated pi with %d random pts is %f ", num_pts_square, pi_mc); fprintf(of, "%f ", pi_mc); } fclose(of); } double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } bool isInsideCircle(const double x, const double y) { const double x_c = 0.5; const double y_c = 0.5; const double r = 0.5; const double f = (x - x_c)*(x - x_c) + (y - y_c)*(y - y_c) - r * r; if (f > 0.0) return false; else return true; }

Keywords: function declaration, function definition, function body

Step 5. 생애 소득 계산에 Monte Carlo Simulation을 적용해보자

먼저 연봉 상승률이 3%로 고정된 상태에서 25-54세까지 소득의 합을 계산해보자.

#include #include #include #include double estimateIncome() { FILE *of = fopen(“annual_salary.txt”, “w”); double annual_salary = 0.3; double income_sum = 0; for (int age = 25; age < 55; age++) { income_sum += annual_salary; fprintf(of, "%f ", annual_salary); const double salary_increase = 0.03;//3% annual_salary *= (1.0 + salary_increase); } fclose(of); return income_sum; } void main() { srand((unsigned int)time(NULL)); printf("%f ", estimateIncome()); } 총합은 14.272625으로 출력 annual_salary.txt를 그래프로 그려보면 아래와 같이 매끈한 곡선을 얻을 수 있다. 여기에 몬테 카를로 시뮬레이션을 적용해보자. 연봉 상승률을 0%에서 6%까지의 난수로 결정해서 위의 소득 계산을 다시 해보자. 아래 코드에서 주석 처리된 부분을 참고해서 직접 수정해보세요. double estimateIncome() { FILE *of = fopen("annual_salary.txt", "w"); double annual_salary = 0.3; double income_sum = 0; for (int age = 25; age < 55; age++) { income_sum += annual_salary; fprintf(of, "%f ", annual_salary); const double salary_increase = getRandomNumber(0.0, 0.06); //const double salary_increase = ?????; annual_salary *= (1.0 + salary_increase); } fclose(of); return income_sum; } void main() { srand((unsigned int)time(NULL)); printf("%f ", estimateIncome()); } 정답 #include #include #include #include double getRandomNumber(const double min, const double max); double estimateIncome() { FILE *of = fopen(“annual_salary.txt”, “w”); double annual_salary = 0.3; double income_sum = 0; for (int age = 25; age < 55; age++) { income_sum += annual_salary; fprintf(of, "%f ", annual_salary); const double salary_increase = getRandomNumber(0.0, 0.06); annual_salary *= (1.0 + salary_increase); } fclose(of); return income_sum; } void main() { srand((unsigned int)time(NULL)); printf("%f ", estimateIncome()); } double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } 올바르게 수정했다면 아래와 같이 불확실성uncertainty이 반영된 그래프를 얻을 수 있다! Step 6. 반복해서 정밀도를 높여보자 #include #include #include #include double estimateIncome() { … … } double getAverageIncome(const int num_itr) { double sum = 0; for (int i = 0; i < num_itr; i++) { sum += estimateIncome(); } return sum / (double)num_itr; } void main() { srand((unsigned int)time(NULL)); for (int i = 1; i < 100000; i *= 2) printf("%f ", getAverageIncome(i)); } 정답 #include #include #include #include double getRandomNumber(const double min, const double max); double estimateIncome() { FILE *of = fopen(“annual_salary.txt”, “w”); double annual_salary = 0.3; double income_sum = 0; for (int age = 25; age < 55; age++) { income_sum += annual_salary; fprintf(of, "%f ", annual_salary); const double salary_increase = getRandomNumber(0.0, 0.06); annual_salary *= (1.0 + salary_increase); } fclose(of); return income_sum; } double getAverageIncome(const int num_itr) { double sum = 0; for (int i = 0; i < num_itr; i++) { sum += estimateIncome(); } return sum / (double)num_itr; } void main() { srand((unsigned int)time(NULL)); for (int i = 1; i < 100000; i *= 2) printf("Monte Carlo itr = %d, Sum = %f ", i, getAverageIncome(i)); } double getRandomNumber(const double min, const double max) { // temp >= 0.0 && temp <= 1.0 double temp = (double)rand() / (double)RAND_MAX; // temp >= min && temp <= max temp = min + (max - min)*temp; return temp; } Keywords: multiple for loops, converge(수렴) 시뮬레이션을 여러 번 해서 평균을 낼수록 연봉상승률을 3%로 고정시켰을 때의 소득 합 14.272625 와 점점 더 가까워지는 것을 확인해보자. (위의 PI 구하기 예제와 동일한 원리입니다.)

몬테카를로 시뮬레이션(Monte Carlo Simulation)

몬테카를로 시뮬레이션(Monte Carlo Simulation)이란 임의의 무작위수들(Random Numbers)을 이용한 반복적인 연산을 통해 특정 함수(들)의 결과 값을 확률적(Probabilistic)으로 계산해 내는 알고리즘입니다. 여기서 확률적 계산이란 결정적(Deterministic) 계산과 대비되는 개념으로서, 이는 필연적으로 알고리즘의 반복과 방대한 양의 계산을 수반하기 때문에 기계를 활용한 수치셈(Computational Calculation)과 함께 언급되는 것이 일반적입니다.

몬테카를로 시뮬레이션은 폴란드 출신의 수학자인 스타니스와프 울람(Stanislaw Ulam)이 개발하였으며 ‘예측이 어려운 결과에 대해서는 반복적 실험을 통해 예상되는 확률을 알아낼 수 있다’는 생각에 기초하여 도박으로 유명한 모나코의 도시 몬테카를로(Monte Carlo)의 이름을 따서 몬테카를로 시뮬레이션을 만들었다고 합니다.

아래에서는 제가 마시모 디 피에로, 『파이썬으로 배우는 실전 알고리즘』, 프리렉(2015), p308-p329의 사례를 참조하여 조금 더 이해하기 쉬운 새로운 예제를 만들어 보았습니다.

위 요소들을 모두 반영하는 단일의 최적화 모델을 수식화 하는 것은 확률의 형태로 표현된 불확실성으로 인해 쉽지 않습니다. 대신 각 방문자를 가정에 따라 모델링 하여 몬테카를로 시뮬레이션을 통해 최적의 재고수준을 구하는 것은 의외로 어렵지 않다는 점을 아래 코드를 통해 알 수 있습니다.

import random import pandas as pd import matplotlib . pyplot as plt def sim ( stock ) : gain = 0 loss = 300 * stock for p in range ( int ( random . gauss ( 557 , 183 ) ) ) : if stock > 0 : if random . random ( ) < 0.05 : stock -= 1 gain += 1000 else : if random . random ( ) < 0.025 : gain += 1000 return gain - loss def iter_sim ( max_stock , how_many ) : final = [ ] for _ in range ( how_many ) : result = [ ] for stock in range ( 1 , max_stock ) : result . append ( sim ( stock ) ) final . append ( result ) plt . style . use ( 'seaborn-whitegrid' ) output = pd . DataFrame ( final ) ax = output . T . plot ( lw = 0.1 , color = 'black' , legend = False ) ax . set_xlabel ( "Stock" ) ax . set_ylabel ( "Gain / Loss" ) output . mean ( ) . plot ( lw = 5 , color = 'red' , legend = False ) plt . show ( ) if __name__ == '__main__' : iter_sim ( 150 , 100 )

몬테카를로 시뮬레이션 예제 | 몬테칼로 시뮬레이션이란? 빠른 답변

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

몬테카를로 시뮬레이션 01

MONTE CARLO SIMULATION

P ( A ) P(A) P(A)에 관한 몬테카를로 시뮬레이션을 구현 하려면 다음의 3가지 원칙을 따라야 합니다.

시행에 대한 시뮬레이션: 컴퓨터의 random numbers를 사용해서 model이나 translate를 구현합니다. 컴퓨터의 random numbers를 사용해서 한번 실험을 수행 한 것을 시행이라고 정의합니다. 시행의 성공에 대한 판단: 시행의 결과를 가지고 사건 A A A가 발생 했는지 안했는지의 여부를 판단합니다. 사건 A A A가 발생했다고 판단 되는 경우에 이것을 성공이라고 정의 합니다. 복제: 위의 1,2번 두 단계를 가능한한 많이 반복합니다. 성공적 시행의 비율이 P ( A ) P(A) P(A)의 시뮬레이션 된 추정값입니다.

앞뒤가 나올 가능성이 동일한 동전에 대해서 3번 동전을 던져서 전부 앞면이 나올 확률을 위의 3원칙을 바탕으로 간단한 몬테카를로 시뮬레이션을 수행 하겠습니다.

NOTE: 앞뒤가 나올 가능성이 동일한 동전에 대해서 3번 동전을 던져서 전부 앞면이 나올 확률 수학적 확률은 1 2 ∗ 1 2 ∗ 1 2 = 1 8 = 0.125 \frac{1}{2} * \frac{1}{2} * \frac{1}{2} = \frac{1}{8} = 0.125 21​∗21​∗21​=81​=0.125

몬테카를로 시뮬레이션을 통해 수확적 확률에 수렴 하는지 테스트를 해 보겠습니다.

코드 설명

시행에 대한 정의 부분입니다. trial := random sample {0,1}, 3번 연속 복원 추출

trial <- sample(0:1, 3, replace = TRUE) 코드 설명 성공에 대한 정의 부분입니다. trial의 합이 3이면 1 아니면 0 if (sum(trial) == 3) 1 else 0 코드 설명 복제에 대한 정의 부분입니다. for문을 통해서 동전을 3번 던지는 실험을 백만번 수행 합니다. 수행 중에 합이 3인 경우만 simlist 벡터에 값을1로 할당합니다. 그 후 mean 함수를 통해서 동전이 3번 나온 경우(즉, 성공한 경우)에 대한 proportion을 계산 합니다. 계산 결과는 수행을 많이 하면 할 수록(n 값을 크게 잡을 수록) 수학적 확률인 1 8 \frac{1}{8} 81​에 수렴합니다. 수렴하는 수리적 이유는 the law of large number(큰수의 법칙)로 설명 할 수 있습니다. 이 내용은 추후에 다루 겠습니다. n := 시행 횟수 정의 simlist := 성공 및 실패에 대한 정보를 원소로 저장할 벡터 정의 mean(simlist) := 앞면이 3번 나옹 경우의 proportion 계산 set.seed(7) n <- 1000000 simlist <- numeric(n) for (i in 1:n) { trial <- sample(0:1, 3, replace = TRUE) success <- if (sum(trial) == 3) 1 else 0 simlist[i] <- success } mean(simlist) ## [1] 0.125775 결과해석 mean(simlist)의 결과가 0.125775로 수학적 확률인 0.125로 소수점 이하 세 째 자리 까지 잘 근사되었음을 확인 할 수 있습니다. 이론적으로는 시행을 무한번으로 한다면 정확히 0.125로 수렴 됩니다. 또 다른 방법 위의 코드는 각 단계별로 시행 -> 성공 -> 복제에 대한 부분을 파악 하기 쉽게 for문을 사용 했는데요.

R의 vectorized 연산(선형대수학의 element-wise operation과 유사: 예를 들어 dot product, scalar vector multiplication etc.)을 이용 하기 위해 다음과 같이 수정할 수 있습니다.

simdivis <- function() { trial <- sample(0:1, 3, replace = TRUE) if (sum(trial) == 3) 1 else 0 } mean(replicate(1000000, simdivis())) ## [1] 0.124846 Reference 본 포스팅은 Probability: With Applications and R 2nd Edition by Amy S. Wagaman (Author), Robert P. Dobrow ISBN-13: 978-1119692386 을 참조 하였습니다. Book link => click here

키워드에 대한 정보 몬테카를로 시뮬레이션 예제

다음은 Bing에서 몬테카를로 시뮬레이션 예제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 몬테칼로 시뮬레이션이란?

  • PM교육
  • PMP교육
  • PMP자격
  • PMBOK
  • 프로젝트관리
  • 리스크관리
  • 몬테칼로
  • 시뮬레이션

몬테칼로 #시뮬레이션이란?


YouTube에서 몬테카를로 시뮬레이션 예제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 몬테칼로 시뮬레이션이란? | 몬테카를로 시뮬레이션 예제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  블랙 박스 어플 비교 | 서울에서 여수까지 설 귀성길 리얼비교 해봤습니다 - 티맵(Tmap) Vs 카카오 내비 엄청난 도착시간 차이 충격적인 결과 117 개의 새로운 답변이 업데이트되었습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *