1장 Introduction to Statistical Computing + Monte-Carlo Simulation

  • Computing Basics
  • Log-Exp Sum Trick
  • Random Number Generators
  • Monte-Carlo Integral
  • Riemann-Stieltjes Integral

Computing Basics

아날로그 컴퓨터

아날로그 컴퓨터들의 경우 전기, 기계 등을 활용하여서 연속적으로 바뀌는 것을 활용합니다. 이것에 대한 대표적인 예시로는 아날로그 시계가 있습니다. 시계를 보면 0→10 \rightarrow 1 으로 바로 쓱 올라가는게 아니라 연속적으로 올라갑니다. 하지만 이는 아날로그 컴퓨터들이며 요즘의 거의 모든 디지털 컴퓨터들은 이렇게 작동하지 않습니다.

디지털 컴퓨터

디지털 / 현대 컴퓨터들은 대부분 이진법 (Binary Language) 를 사용합니다 (0 or 1)(0 \text{ or }1). 컴퓨터의 CPU 에 따라서 이게 결정이 되는데, 우선은 이진법에 대해서 간단히 다루겠습니다.

이진법

00 과 11 으로만 숫자를 표현하는 방식이며 이것은 컴퓨터의 전기 신호가 켜졌는지 (1)(1) 아니면 꺼졌는지 (0)(0) 에 따라서 정보를 다루게 됩니다. 하나의 신호를 보통은 bit\texttt{bit} 이라고 하며, 다음 예시를 보면 이해하기 편할겁니다.

표현할 숫자 (10-진법 기준) : 5=1+4=20⋅1+21⋅0+22⋅15 = 1 + 4 = 2^0 \cdot 1 + 2^1 \cdot 0 + 2^2 \cdot 1

신호202^0212^1222^2
1OXO
0XOX
값20⋅1=1⋅1=12^0 \cdot 1 = 1 \cdot 1 = 121⋅0=2⋅0=02^1 \cdot 0 = 2 \cdot 0 = 022⋅1=4⋅1=42^2 \cdot 1 = 4 \cdot 1 = 4

지금의 경우에는 3 bit3 \texttt{ bit} 만 사용했기에 23−1=8−1=72^3 -1= 8 - 1=7 까지 숫자를 표현하는게 가능합니다.

디지털 컴퓨터들의 경우 다음과 같은 숫자 표현들을 사용한다고 합니다. (128-bit 는 사용하기에는 비효율적)

Bits32-bit (Single Precision)64-bit (Double Precision, 요즘 컴퓨터들 맥 등등)
Sign0000
Exponent1−71 - 71−111 - 11
Mantissa8−318 - 3112−6312 - 63

그리고 Capacity 는 다음과 같습니다.

32-bit64-bit128-bit (Quadruple Precision)
Decimal Digits7.227.2215.9515.9534.0234.02
Decimal E max38.2338.23307.95307.954931.774931.77

Capacity 를 넘게 된다면 Overflow / Underflow 문제가 발생하게 됩니다. 이를 방지하기 위한 방법들이 굉장히 많지만, 우선은 아래 내용을 진행하겠습니다.

그렇다면 소수들은 이 bit\texttt{bit} 를 이용해서 어떻게 표현할까요? →\rightarrow Exponent & Mantissa

Mantissa 표현법

Fixed-Point Representation (고정소수점) 이 있으며 Floating-Point Representation (부동소수점) 이 있습니다.

  • Fixed-Point Representation 의 경우 매 숫자마다 소수점을 미리 정해진 위치에 고정을 시켜줍니다.
  • Floating-Point Representation 의 경우 매 숫자마다 소수점 위치를 지수에 따라서 변형시켜줍니다.

예시로 숫자 75.3175.31 이 있다고 하겠습니다.

  • 이 숫자를 Fixed-Point Representation 으로 표현하면 똑같이 75.3175.31 이 됩니다.
  • 반면에 Floating-Point Representation 으로 표현하면 0.7531E⁡02=0.7531⋅1020.7531 \operatorname{E}02 = 0.7531 \cdot 10^2 으로 변형됩니다.

둘다 똑같은 값이며 그저 표현의 차이가 있을 뿐입니다. 그러면 부호 그리고 Mantissa 는 뭘까요?

  • 부호의 경우에는 ++ 아니면 −- 으로 둘 중에 하나이며, 이것도 Binary 으로 하나의 bit\texttt{bit} 으로 표현해주면 됩니다.
  • 그러면 64-bit 기준에서 1개의 bit 는 부호로 사용되기에 63 개로 이제는 표현해줘야 합니다. 이때 저희는 Floating-Point Representation 을 따르기에 먼저 숫자를 0.7531E⁡020.7531 \operatorname{E} 02 으로 바꿔줍니다.
  • E⁡\operatorname{E} 뒤의 값들은 Exponent 으로 곱해줘야 하기에 이 값을 표현하기 위해서 비트를 1111 개를 또 할당시켜줍니다.
    • 이때 함정이 있다면 실제로 곱해지는 것은 10e⁡10^{\operatorname{e}} 가 아니라 2e⁡2^{\operatorname{e}} 입니다.
    • 추가적으로 e⁡\operatorname{e} 의 값이 음수가 될 수도 있기에 원래는 1111 개로 0−20470 - 2047 까지 표현할 수 있지만, Bias Term 을 중앙값 (1023)(1023) 으로 넣어줘서 −1023∼1023-1023 \sim 1023 까지 표현해줄 수 있게 됩니다.
    • Bias 를 안쓰고 e⁡\operatorname{e} 의 첫번째 비트를 부등호로 바꿔서 위와 같이 똑같이 표현해주는 방식도 존재합니다.
  • 그러면 이제는 5252 개의 비트가 남으며 이것으로 E⁡\operatorname{E} 앞의 숫자를 표현해주면 됩니다.

정확하게는 다음과 같습니다.

https://numeral-systems.com/ieee-754-converter/

소수는 어떻게 처리할까요?

사실 위의 경우에는 숫자를 어떻게 표현하냐에 대해서이며, 이는 이진법 10-진법 둘다 적용이 가능합니다. 하지만 컴퓨터는 이진법을 사용하기에 소수 부분만 갖고올 때도 10-진법에서 이진법으로 바꿔줘야 합니다. 그럼 이것을 어떻게 바꿀까요?

예시로 0.70.7 와 같은 간단한 소수값을 가져오겠습니다. 이것을 다음과 같이 표현하는게 가능합니다.

0.7=(0.5)+0.2=(0.5+0+0.125)+0.075=(0.5+0+0.125+0.0625)+0.012510=(0.5+0+0.125+0.0625+0+0+0.0078125)+0.004687510=⋯10=(1⋅2−1+0⋅2−2+1⋅2−3+1⋅2−4+0⋅2−5+0⋅2−6+1⋅2−7+⋯ )10=0.1011001⋯2\begin{aligned} 0.7 &= (0.5) + 0.2 = (0.5 + 0 + 0.125) + 0.075 \\&= (0.5 + 0 + 0.125 + 0.0625) + 0.0125 {}_{10} \\&= (0.5 + 0 + 0.125 + 0.0625 + 0 + 0 + 0.0078125) + 0.0046875 {}_{10} = \cdots{}_{10} \\&= \left(1 \cdot 2^{-1} + 0 \cdot 2^{-2} + 1 \cdot 2^{-3} + 1 \cdot 2^{-4} + 0 \cdot 2^{-5} + 0 \cdot 2^{-6} + 1 \cdot 2^{-7} + \cdots \right) {}_{10} \\&= 0.1011001\cdots_2 \end{aligned}

이것을 결국에는 이진법으로 처리하면 0.1011001100110011001100110⋯20.1011001100110011001100110\cdots_2 으로 나오게 됩니다.

그러면 예시로 Mantissa 표현법에 대해서 조금 더 자세히 설명하겠습니다.

예시 1 (63.74510)(63.745_{10}) :

  • 양수이기에 Sign 은 00
  • 정수부분 :

    6310=26⋅1+25⋅1+24⋅1+23⋅1+22⋅1+21⋅1+20⋅1  10=1111111263_{10} = 2^6 \cdot 1 + 2^5 \cdot 1 + 2^4 \cdot 1 + 2^3 \cdot 1 + 2^2 \cdot 1 + 2^1 \cdot 1 + 2^0 \cdot 1 \; {}_{10}= 1111111_{2}

  • 소수 부분 :

    0.74510=(0.5+0+0.125+0.0625+0.03125+0.015625+⋯ )10=(1⋅2−1+0⋅2−2+1⋅2−2+1⋅2−3+1⋅2−4+1⋅2−5+1⋅2−6+⋯ )10=0.1011111⋯2\begin{aligned} 0.745_{10} &= (0.5 + 0 + 0.125 + 0.0625 + 0.03125 + 0.015625 + \cdots) {}_{10} \\&= \left( 1 \cdot 2^{-1} + 0 \cdot 2^{-2} + 1 \cdot 2^{-2} + 1 \cdot 2^{-3} + 1 \cdot 2^{-4} + 1 \cdot 2^{-5} + 1 \cdot 2^{-6} + \cdots \right)_{10} \\&= 0.1011111\cdots_2 \end{aligned}

  • 합하면 :

    63.74510=111111.1011111010111000010⋯2=1.111111011111010111000010⋯2×25\begin{aligned}63.745_{10} &= 111111.1011111010111000010\cdots_2 \\&= 1.111111011111010111000010\cdots_2 \times 2^5 \end{aligned}

  • 그러면 Mantissa 부분은 111111011111010111000010⋯111111011111010111000010\cdots
  • Exponent 는 55 이며 Bias 는 10231023 이기에 e⁡=1023+5=1028\operatorname{e} = 1023 + 5 = 1028

Errors in Computation

  • Representation Error : 컴퓨터는 사실 유리수를 잘 표현하지 못합니다. 그렇기에 늘 근사를 합니다. 0.10.1 와 같은 단순한 숫자도 64-bit 기준으로는 0.000110011⋯20.000110011\cdots_2 으로 표현이 됩니다. 그럼에도 불구하고 이 숫자를 표현하기 위해서는 끝자락에서 반올림을 시켜서 진행을 합니다. 즉 늘 실제 값이랑 컴퓨터가 표현한 값에는 Representation Error 가 존재한다는 것입니다 (딱 떨어지지 않는 이상).
    • 예시로 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1==10.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1 을 R\texttt{R} 코드에서 치면 FALSE\texttt{FALSE} 가 나오게 됩니다.
  • Truncation Error : 유리수도 표현 못하면 무리수도 당연하게 표현을 못합니다. 무리수들의 경우에는 그래서 Taylor Series 와 같은 것을 활용시키며, 이 값은 어느 시점 부터 Truncate 이 됩니다. 이때 Truncate 을 잘못하게 된다면 실제 값이랑 오차가 생기는 수밖에 없습니다.

Examples of Computation Error in R\texttt{R}

Log-Exp Sum Trick

우선은 Overflow 와 Underflow 문제가 뭔지부터 파악해야됩니다. 앞서 저희는 Mantissa 표현이 어떻게 되는지에 대해서 알아보았으며, 이를 활용한다면 Overflow 와 Underflow 는 다음과 같이 정의가 가능합니다.

  • Overflow : Mantissa 으로 표현할 수 있는 최대 숫자보다 값이 클 때 생기는 에러
  • Underflow : Mantissa 으로 표현할 수 있는 최대 숫자보다 값이 작을 때 생기는 에러

생각보다 자주 일어나지는 않지만, 일어나더라도 해결할 수 있는 방안들이 많으며, 이 중에서 하나가 바로 Log-Exp Sum Trick 입니다. 로그와 exp 성질을 활용하면 다음과 같이 쓸 수 있습니다.

log⁡(exp⁡(x))=c−c+log⁡(exp⁡(x))=c+log⁡(exp⁡(−c))+log⁡(exp⁡(x))=c+log⁡(exp⁡(x−c))\log \left( \exp\left( x \right) \right) = c - c + \log \left( \exp\left( x \right) \right) = c + \log(\exp(-c)) + \log \left( \exp\left( x \right) \right) \\= c + \log (\exp(x - c))

근데 이게 유용한 점이, 로그 안에서 Summation 값을 구하는데에도 유용해지게 됩니다.

log⁡(∑i=1mexp⁡(xi))=c+log⁡(∑i=1mexp⁡(xi−c))\log\left(\sum_{i=1}^m \exp(x_i) \right) = c + \log \left( \sum_{i=1}^m \exp(x_i - c) \right)

이때 보통 cc 의 값은 c:=max⁡i∈[m]xic := \max_{i\in [m]} x_i 으로 정해지게 됩니다.

예시로는 다음과 같이 활용할 수 있게 됩니다.

Random Number Generators

랜덤한 숫자를 생성하기 위해서는 어떻게 해야할까요?

물리적인 세상에서의 예시로는 주사위, 로또, 카드 썪기 등등의 방법들을 생각할 수가 있습니다. 하지만 모든게 계산으로 이뤄지는 전산에서는 결국에는 알고리즘을 활용해야됩니다.

이에 대한 예시를 Middle-Square Method, Linear Congruential Method 들이 존재합니다. 이때 RNG 가 가져야할 조건들이 다음과 같습니다.

원하는 조건실제 방법
균일 분포와 통계적으로 똑같은가통계 검정으로 확인
효율적인가단순한 산술 연산만 사용
일부로 특정 값이 나올 수가 있나 (Reproducible 한가), R 에서는 set.seed 통해서 가능초깃값(seed)을 고정

Middle-Square Method

컴퓨터의 아버지이신 완전 말도 안되는 천재 John von Neumann 님이 만드신 너무나도 간단한 방법입니다. 그렇기에 사실 현대 사회에서는 아쉽게도 사용되기 애매합니다.

2 자리 RNG using Middle-Square Method

  • 두자리 초깃값을 xx 라 하기.
  • xx 를 제곱시켜서 4자리 수 만들기. 이때 앞자리가 빈다면 00 으로 채워주기.
  • xx 의 중간 숫자 2개를 다음 랜덤 숫자로 만들기.
x <- 어떤 2-Digit 초깃값
x <- x ** 2 # 제곱을 시켜주며 4-Digit 으로 바꿔줌, 4자리수가 안된다면 0 을 붙여준다.
x <- x[2:4] # 근데 사실 이건 R 코드에서 안되기에 % 를 활용하면서 이거를 해줘야함.
cat("새로운 숫자는 ", x)

4 자리로 늘렸을 때 나오는 Histogram 입니다.

뭐가 문제점일까요? 바로 Loop 입니다. 예시로 33173317 의 값을 초깃값으로 주었다고 해보겠습니다.

33172=11002489→00242=00000576→00052=00000025→00002=000000003317 ^ 2 = 11002489 \rightarrow 0024^ 2 = 00000576 \rightarrow 0005 ^2 = 00000025 \rightarrow 0000^2 = 00000000

이러한 문제점이 이 Middle-Square Method 에 존재하며, 초깃값에 따라서 어떨 때는 RNG 의 역할을 못할 때도, 어떨 때는 괜찮게 수행할 때도 있습니다.

Linear Congruential Method

1958 년도에 만들어진 RNG 이며 가장 영향력이 큰 RNG 기법 중에서 하나입니다. 방식은 다음과 같습니다.

  1. X0,A,C,MX_0, A, C, M 을 먼저 고른다.
  1. Xt←(AXt−1+C)mod⁡MX_t \leftarrow (A X_{t-1} + C) \operatorname{mod} M
  1. 2 번을 계속해서 반복해준다.

이때 이 방법의 특징들이 있는데, 이는 다음과 같다.

  • 이론적으로 최대 Period 는 MM 이다 (값들만 잘 정해준다면).
  • XtX_t 에 추가시키기 전에 값을 M−1M-1 으로 나눠주면 0∼10 \sim 1 사이의 값이 나오게 된다.
  • 처음 값들을 잘 설정만 해준다면 균일분포처럼 나오게 된다.

그럼 예시 결과를 한번 보겠습니다.

C = 59049, M = 34341, A = 2345, N = 10000000
C = 3^10, M = 2^32, A = 7^6, N = 10000000

보이시는 바와 같이 값들을 잘 선정하게 된다면 오른쪽과 같이 거의 균일분포의 모습을 띄우게 됩니다.

그러면 저희가 구현한 RNG 가 진정한 RNG 인 Unif⁡(0,1)\operatorname{Unif}(0,1) 과 같은 분포를 갖게 된다는 확인을 어떻게 할까요?

Statistical Tests for Uniformity

검정 기법들

  • χ2\chi^2-goodness-of-fit test
  • Kolmogorov-Smirnov test
  • Double-Root Residual

그래프 기법들

  • 히스토그램 (Histogram)
  • Probability Plot
  • QQ-Plot

runif(⋅)\texttt{runif}(\cdot) 도 사실은 완전히 랜덤한 RNG 는 아니지만, 사용하기에 부족함이 없다.

Monte-Carlo Integral

적분의 경우 전산적으로 어떻게 계산할까요? 그것을 알기 위해서는 적분에 대해서 잠깐 얘기해보겠습니다.

y=∫01f(x)dxy = \int_0^1 f(x) dx

위와 같은 적분 값이 있다고 하겠습니다. 그러면 이때 f(x)f(x) 가 어떻게 생겼는지에 따라서 저희는 그저 손으로 적분도 할 수 있으며 너무 어렵다면 적분이 손으로는 현실적으로 불가능한 경우도 존재합니다. 그렇기에 저희는 이 적분 값을 근사 시켜주면 되며, Riemann Integral 를 활용하는 Numerical Integration 방법도 있지만 이 강의의 대부분은 Monte-Carlo Integration 방법을 사용한다고 보시면 됩니다.

위의 적분값을 다음과 같이 조금 다르게 해석해보겠습니다.

y=∫01f(x)dx=∫0111−0⋅f(x)dx=E[f(U)],U∼Unif⁡(0,1)y = \int_0^1 f(x) dx = \int_0^1 \frac{1}{1 - 0} \cdot f(x) dx = \mathbb{E}\left[f(U) \right], \quad U \sim \operatorname{Unif}(0, 1)

수식적으로 틀린 것은 지금까지 아무 것도 없습니다. 즉 다시말해 근사를 한 것은 아무것도 없습니다. 하지만 이때 여기서부터 저희는 Monte-Carlo Integration 을 적용시켜줍니다.

Law of Large Numbers

대수의 법칙으로도 알려져 있으며, 이것을 알기 위해서는 우선은 X1,X2,⋯ ,Xn∼i.i.df(x;θ)X_1, X_2, \cdots, X_n \stackrel{\text{i.i.d}}{\sim} f(x;\theta) 이라고 정의하며, 특징으로는 E[Xi]=μ,Var⁡(Xi)=σ2\mathbb{E}[X_i] = \mu, \quad \operatorname{Var}(X_i) = \sigma^2 이라고 하겠습니다.

추정량을 Xˉn=1n∑i=1nXi\bar{X}_n =\frac{1}{n} \sum_{i=1}^n X_i 으로 정의하겠습니다. 그러면 다음과 같이 말할 수가 있습니다.

  • Weak Law of Large Numbers :
    ∀ε>0,lim⁡n→∞P(∣Xˉn−μ∣>ε)=0{}^{\forall}\varepsilon > 0, \quad \lim_{n \rightarrow \infty} \mathbb{P}\left( \left| \bar{X}_n - \mu \right| > \varepsilon \right) = 0
    • 증명은 Chebyshev’s Inequality 사용하면 됩니다.

      Chebyshev’s Inequality 에 의하면,

      Var⁡(Xˉn)=σ2n,By Chebyshev’s Inequality, k:=nεσ ∀ε>0,lim⁡n→∞P(∣Xˉn−μ∣≥ε)<σ2nε2→n→∞0\operatorname{Var}(\bar{X}_n) = \frac{\sigma^2}{n}, \quad \text{By Chebyshev's Inequality, } k:= \frac{\sqrt{n} \varepsilon}{\sigma} \\~\\ {}^{\forall}\varepsilon > 0, \quad \lim_{n \rightarrow \infty} \mathbb{P}\left( \left| \bar{X}_n - \mu \right| \ge \varepsilon \right) < \frac{\sigma^2}{n \varepsilon^2} \stackrel{n\rightarrow \infty}{\rightarrow} 0
  • Strong Law of Large Numbers :
    P(lim⁡n→∞Xˉn=μ)=1\mathbb P\left( \lim_{n \rightarrow \infty} \bar{X}_n = \mu \right) = 1

    즉 확률 1으로 Xˉn\bar{X}_n 은 μ\mu 으로 수렴하게 된다는 말입니다.

이것을 활용하게 된다면, E[X]=E[Xˉn]=μ≈Xˉn\mathbb{E}[X] = \mathbb{E}[\bar{X}_n] = \mu \approx \bar{X}_n 으로 추정해도 된다는 뜻입니다.

Monte-Carlo Integration

아까 보았던 예시로 돌아가겠습니다.

y=∫01f(x)dx=E[f(U)],U∼Unif⁡(0,1)y = \int_0^1 f(x) dx = \mathbb{E}\left[f(U) \right], \quad U \sim \operatorname{Unif}(0, 1)

이때 UU 는 그저 균일분포의 확률변수, 즉 RNG 와 같은 분포라고 보시면 됩니다. LLN 을 이용하면 다음과 같이 적을 수 있게 됩니다.

y=∫01f(x)dx=E[f(U)]≈1n∑i=1nf(Ui),Ui∼i.i.dUnif⁡(0,1)y = \int_0^1 f(x) dx = \mathbb{E}[f(U)] \approx \frac{1}{n} \sum_{i=1}^n f(U_i), \quad U_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(0, 1)

ㄹ이 방식을 이용해서 적분값을 추정하는 것이 바로 Monte-Carlo Integral 입니다. 당연하게도 지금의 경우에는 x∈(0,1)x \in (0,1) 이라는 아주 간편한 구간 내에 있기 때문에 이렇게 쉽게 이해가 될 수 있지만, 이것이 x∈(a,b)x \in (a,b), x∈(0,∞)x\in (0, \infty), x∈(−∞,∞)x\in (-\infty, \infty) 등의 구간에서도 활용이 충분히 가능합니다.

  • x∈(a,b)x \in (a,b) 인 케이스

    Change of Variables 를 적용시키면 됩니다. 예시로 위와 같은 Notation 으로 다음과 같은 상황을 고려해보겠습니다.

    y=∫abf(x)dxy = \int_a^b f(x) dx

    이때 저희가 u:=x−ab−a,  z∈(0,1)u := \frac{x - a}{b - a}, \; z \in (0, 1) 으로 두며 Jacobian 은 ∣J∣=∣dxdu∣=∣b−a∣|J| = \left| \frac{dx}{du} \right| = |b-a| 으로 세팅한다면 다음과 같이 적분식이 변하게 됩니다. p.s. x=a+(b−a)⋅ux = a + (b-a) \cdot u,

    y=∫abf(x)dx=∫01f(a+(b−a)u)⋅∣J∣du=∫01f(a+(b−a)u)(b−a)du =(b−a)⋅∫01f(a+(b−a)u)du≈(b−a)⋅1n∑i=1nf(a+(b−a)Ui),Ui∼i.i.dUnif⁡(0,1)y = \int_a^b f(x) dx = \int_0^1 f(a + (b-a) u) \cdot |J| du = \int_0^1 f(a + (b-a)u) (b-a)du \\~\\ = (b-a) \cdot \int_0^1 f(a+(b-a)u)du \approx (b-a) \cdot \frac{1}{n}\sum_{i=1}^n f(a + (b-a) U_i ), \\ U_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(0, 1)
  • x∈(0,∞)x \in (0,\infty) 인 케이스

    (0,∞)→(0,1)(0, \infty) \rightarrow (0, 1) 으로 바꿔주는 함수가 무엇이 있을까? (이걸 만족하는 아무 함수 써도 되긴 함)

    • 우리는 u=1x+1u = \frac{1}{x+1} 을 고려해볼 수가 있다. 준비를 해보자면,
      • u:=1x+1,  u∈(0,1)u := \frac{1}{x+1}, \; u \in (0, 1)
      • x=1u−1,  dx=−1u2dux = \frac{1}{u} - 1, \; dx = -\frac{1}{u^2} du
      • ∣J∣=∣dxdu∣=∣−1u2∣=1u2|J| = \left|\frac{dx}{du}\right| = \left| -\frac{1}{u^2} \right| = \frac{1}{u^2}
    y=∫0∞f(x)dx=∫01f(1u−1)∣J∣du=∫011u2f(1u−1)du =E[1Ui2f(1Ui−1)]≈LLN1n∑i=1nUi2f(1Ui−1),Ui∼i.i.dUnif⁡(0,1)y = \int_0^\infty f(x) dx = \int_0^1 f\left(\frac{1}{u} - 1\right) |J| du = \int_0^1 \frac{1}{u^2} f\left(\frac{1}{u} - 1\right) du\\~\\ = \mathbb{E}\left[ \frac{1}{U_i^2} f\left(\frac{1}{U_i} - 1\right) \right] \stackrel{\text{LLN}}{\approx} \frac{1}{n}\sum_{i=1}^n {U_i^2} f\left(\frac{1}{U_i} - 1\right), \quad U_i\stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(0,1)
    • 혹은 u=e−xu = e^{-x} 도 고려해볼 수가 있다.
      • u:=exp⁡(−x),u∈(0,1)u:= \exp(-x), u \in (0, 1)
      • x=−log⁡(u),  dx=−duux = -\log(u), \; dx = -\frac{du}{u}
      • ∣J∣=∣dxdu∣=∣−1u∣=1u|J| = \left| \frac{dx}{du} \right| = \left| -\frac{1}{u} \right| = \frac 1 u
      y=∫0∞f(x)dx=∫01f(−log⁡u)∣J∣du=∫011uf(−log⁡u)du =E[1uf(−log⁡u)]≈LLN1n∑i=1n1Uif(−log⁡Ui),Ui∼i.i.dUnif⁡(0,1)y = \int_0^\infty f(x) dx = \int_0^1 f\left(-\log u \right) |J| du = \int_0^1 \frac{1}{u} f(-\log u)du \\~\\ = \mathbb{E}\left[ \frac{1}{u} f(-\log u) \right] \stackrel{\text{LLN}}{\approx} \frac{1}{n}\sum_{i=1}^n \frac{1}{U_i} f(-\log U_i), \quad U_i \stackrel{\text{i.i.d}}{\sim}\operatorname{Unif}(0, 1)
  • x∈(−∞,∞)x \in (-\infty,\infty) 인 케이스

    (−∞,∞)→(0,1)(-\infty, \infty) \rightarrow (0, 1) 으로 바꿔주는 함수가 무엇이 있을까? 대표적으로는 Sigmoid 함수가 있다 (Logit Transformation). 즉 u:=11+e−xu := \frac{1}{1+e^{-x}} 를 고려해볼 수가 있다.

    • u:=11+e−x,  u∈(0,1)u:= \frac{1}{1+e^{-x}}, \; u \in (0, 1)
    • x=log⁡(u1−u),  dx=1u(1−u)dux = \log\left( \frac{u}{1-u} \right), \; dx = \frac{1}{u(1-u)}du
    • ∣J∣=∣dxdu∣=∣1u(1−u)∣=1u(1−u)|J| = \left| \frac{dx}{du} \right| = \left| \frac{1}{u (1-u)} \right| = \frac{1}{u(1-u)}
    y=∫−∞∞f(x)dx=∫01f(log⁡u1−u)∣J∣du =∫011u(1−u)f(log⁡u1−u)du=E[1Ui(1−Ui)f(log⁡Ui1−Ui)] ≈LLN1n∑i=1n1Ui(1−Ui)f(log⁡Ui1−Ui),Ui∼i.i.dUnif⁡(0,1)y = \int_{-\infty}^\infty f(x) dx = \int_0^1 f\left(\log\frac{u}{1-u}\right) |J| du \\~\\ = \int_0^1 \frac{1}{u(1-u)} f\left(\log\frac{u}{1-u}\right) du = \mathbb{E}\left[\frac{1}{U_i(1-U_i)} f\left(\log\frac{U_i}{1-U_i}\right) \right] \\~\\ \stackrel{\text{LLN}}{\approx} \frac{1}{n} \sum_{i=1}^n \frac{1}{U_i(1-U_i)} f\left(\log\frac{U_i}{1-U_i}\right), \quad U_i\stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(0, 1)

그렇다면 실제로 적용시킬만한 좋은 예시가 무엇이 있을까요? 바로 π\pi 값을 구하는 것입니다. 동그라미의 넓이는 초등학생도 알다시피 A=πr2A = \pi r^2 입니다. 그렇다면 이 동그라미를 (−1,1)2(-1,1)^2 에 그려보면 어떻게 나올까요?

보라색 구역의 경우 x2+y2≤1x^2 + y^2 \le 1 의 구역을 그대로 그린 것입니다. 동그라미 넓이에 포함되는 구역을 구했으니, 이제는 균일분포를 활용시켜야합니다. 이때 저희가 알 수 있는 것은 원을 둘러싸는 정사각형이 (−1,1)2(-1, 1)^2 전체이며, 정사각형 내에서 아무 곳을 샘플하려면 그저 독립된 균일분포에서 한번 샘플하면 끝납니다.

그림에서의 원의 넓이는 그러면 r=1r = 1 이기에 Acircle=πr2=πA_{\text{circle}} = \pi r^2 = \pi 이며, 정사각형의 넓이는 Asquare=(1−(−1))2=22=4A_{\text{square}} = (1 - (-1))^2 = 2^2 = 4 입니다. 그러면 정사각형 아무데나에서 샘플을 했을 때 좌표가 동그라미 안에 들어갈 비유는 다음과 같습니다.

AcircleAsquare=π4\frac{A_{\text{circle}}}{A_{\text{square}}} = \frac{\pi}{4}

그러면 수식적으로 적용을 시켜보자면,

  • (X,Y)∈(−1,1)2,  Xi∼i.i.dUnif⁡(−1,1),  Yi∼i.i.dUnif⁡(−1,1)(X,Y) \in \left(-1, 1\right)^2, \; X_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(-1,1), \; Y_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(-1,1)
  • P{(X,Y)∈원}=P{X2+Y2≤1}=π4\mathbb{P}\left\{ (X,Y) \in \text{원} \right\} = \mathbb{P}\left\{ X^2 + Y^2 \le 1 \right\} = \frac{\pi}{4}

저희가 알고 싶은 것은 사실 그러면 이 확률 값인 P{X2+Y2≤1}\mathbb{P}\left\{ X^2 + Y^2 \le 1 \right\} 이며, 이를 추정하기 위해서 다음과 같이 세워주면 됩니다.

P{(X,Y)∈원}=P{X2+Y2≤1}=E[1(X2+Y2≤1)] ≈LLN1n∑i=1n1(Xi2+Yi2≤1),Xi∼i.i.dUnif⁡(−1,1),  Yi∼i.i.dUnif⁡(−1,1)\mathbb{P}\left\{ (X,Y) \in \text{원} \right\} = \mathbb{P}\left\{ X^2 + Y^2 \le 1 \right\} = \mathbb{E}\left[\mathbb{1}\left( X^2 + Y^2 \le 1 \right) \right] \\~\\ \stackrel{\text{LLN}}{\approx} \frac{1}{n} \sum_{i=1}^n \mathbb{1}\left( X_i^2 + Y_i^2 \le 1 \right), \quad X_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(-1,1), \; Y_i \stackrel{\text{i.i.d}}{\sim} \operatorname{Unif}(-1,1)

그러면 이것을 Monte-Carlo Integration 으로 바로 해보겠습니다.

그저 원과 함께 그린 결과 :

Trace Plot 결과 :

실제 값 결과 (또 다시 돌려서 위의 Trace Plot 과는 다를 수도 있음) :

  • π=3.141593\pi = 3.141593
  • N=1000,  π^=3.176,  ∣π^−π∣=0.034407N = 1000, \; \hat \pi = 3.176, \; |\hat{\pi} - \pi| = 0.034407
  • N=10000,  π^=3.136,  ∣π^−π∣=0.005592N = 10000, \; \hat \pi = 3.136, \; |\hat \pi - \pi | = 0.005592
  • N=100000,  π^=3.14004,  ∣π^−π∣=0.001552N = 100000, \; \hat \pi = 3.14004, \; |\hat \pi - \pi | = 0.001552
  • N=1000,  π^=3.142148,∣π^−π∣=0.000555N = 1000, \; \hat \pi = 3.142148, |\hat \pi - \pi | = 0.000555

Riemann-Stieltjes Integral

적분이 있다면 이 적분을 구하는데 다양한 방법들이 존재하지만, 그 중 Riemann Integral 이 있습니다.

Riemann Integral

리만이란 수학자는 “함수 ff 가 정의된 구간 [a,b][a,b] 에서 넓이를 어떻게 수학적으로 정의할까” 에 대한 질문을 답하기 위한 방법 중 가장 기본적인 적분법이 Riemann Integral 입니다.

아주 간단하게 [a,b][a,b] 사이의 구간을 nn 개의 똑같은 길이의 작은 구간들로 쪼개갰습니다. 각 구간들의 값을 xix_i 라고 하며, 이는 그러면 다음과 같은 Partition 으로 표현할 수 있습니다.

P:a=x0<x1<⋯<xi−1<xi<xi+1<⋯<xn=b,Δxi=xi−xi−1P: a = x_0 < x_1< \cdots < x_{i-1} < x_i < x_{i+1} < \cdots < x_n = b, \quad \Delta x_i = x_i - x_{i-1}

작은 구간들은 그럼 총 nn 개로 [xi,xi−1],  i∈1,⋯ ,n[x_i, x_{i-1}] ,\; i \in 1, \cdots, n 으로 표현할 수 있습니다.

이때 저희는 각각의 작은구간 [xi,xi−1][x_i, x_{i-1}] 내에서 한 점 ξi\xi_i 를 골라줍니다. 그러면 Riemann Sum 을 다음과 같이 정의할 수 있습니다.

S(P,f)=∑i=1nf(ξi)ΔxiS(P, f) = \sum_{i=1}^n f(\xi_i) \Delta x_i

이때 가장 넓은 작은구간의 길이를 ∥P∥=max⁡iΔxi\| P \| = \max_i \Delta x_i 으로 Mesh 이라고 정의할 수 있습니다.

만약에 이 작은구간들을 훨씬 더 촘촘히, 즉 ∥P∥→0\| P \| \rightarrow 0 으로 두게 되어서 나온 Riemann Sum 이 II 이라고 한다면, 다음과 같이 Riemann Integral 을 정의하는 것이 가능해집니다.

∫abf(x)dx=I\int_a^b f(x) dx = I

다시 말하자면 Partition PP 와 ξi\xi_i 를 골랐을 때 Riemann Sum 이 같은 값으로 수렴하면 Riemann 적분이 가능하다는 뜻입니다.

https://en.wikipedia.org/wiki/Riemann_integral

Riemann-Stieltjes Integral

아까 보았던 Riemann-Integral 은 사실 그저 기본 폭을 더해주는 것이었습니다. 즉 다시 말하자면 xx-축의 폭에 대해서 나눈거나 다름 없습니다. 그렇다면 폭 대신에 어떤 함수 hh 의 증가분으로 바꿔주면 어떻게 될까요?

즉 다시 말하자면 Δhi=h(xi)−h(xi−1)\Delta h_i = h(x_i) - h(x_{i-1}) 을 사용하면 어떻게 될까요? 이게 사실은 Riemann-Integral 의 Generalized Version 입니다.

시작하자면, 이제는 분할을 h(x)h(x) 를 기준으로 하기 때문에 저희가 구하고자 하는 적분은 다음과 같습니다.

∫abf(x)dh(x)\int_a^b f(x) dh(x)

작은구간들의 경우에는 우선은 Partition PP 는 다음과 같이 똑같이 정의해줍니다.

P:a=x0<x1<⋯<xi−1<xi<xi+1<⋯<xn=bP: a = x_0 < x_1< \cdots < x_{i-1} < x_i < x_{i+1} < \cdots < x_n = b

Riemann-Stieltjes Integral 의 정의로는 다음과 같습니다.

S(P,f,h)=∑i=1nf(ξi)⋅[h(xi)−h(xi−1)]S(P, f, h) = \sum_{i=1}^n f(\xi_i) \cdot \left[ h(x_i) - h(x_{i-1}) \right]
h = x^2
h = x^5

그러면 이에 해당하는 특수 케이스는 뭐가 있을까요?

  • g(x)=xg(x) = x 이면 g(xi)−g(xi−1)=xi−xi−1g(x_i) - g(x_{i-1}) = x_i - x_{i-1} 이기에 Riemann Integral 이랑 똑같아진다.
  • g(x)g(x) 가 계단 함수이면 점에서의 Jump ×f값\text{점에서의 Jump }\times f \text{값} 들의 합으로 표현할 수 있습니다.

그렇다면 이를 기댓값에 적용시키면 어떻게 될까요?

Riemann-Stieltjes Integral on Expectation

Non-decreasing 하며 Right-Semicontinuous 한 함수 ff 에 대해서 저희는 다음과 같이 정의할 수 있게 됩니다.

∫abg(x)df(x)=lim⁡n→∞∑i=1ng(xi)⋅[f(xi)−f(xi−1)]\int_a^b g(x) df(x) = \lim_{n\rightarrow \infty} \sum_{i=1}^{n} g(x_i)\cdot \left[ f(x_i) - f(x_{i-1})\right]

여기까지는 그저 Riemann-Stieltjes Integral 과 똑같습니다. 하지만 기댓값을 이제는 적용시켜보겠습니다.

X∼FX \sim F 이며 FF 가 CDF 이라고 할 때, 저희는 CDF 의 Non-decreasing 하면서 Right-Semicontinuous 하다는 특징을 활용하여 다음과 같이 임의의 함수 ff 에 대해서 f(X)f(X) 에 대한 기댓값을 정의할 수 있습니다.

E[g(X)]=∫−∞∞g(x)dF(x)=∫−∞∞g(x)fX(x)dx\mathbb{E}\left[g(X) \right] = \int_{-\infty}^\infty g(x) dF(x) = \int_{-\infty}^\infty g(x) f_X(x) dx

이때 사용한 가정은 바로 모든 xx 에 대해서 F(x)F(x) 가 미분이 가능하다는 것이며, 미분이 불가능한 구간을 사실은 포함할 수도 있습니다. (물론 학부 수준에서는 요구가 안되긴 합니다)

그리고 이것은 XX 가 Continuous 한 경우에서 저렇게 전개되며 만약에 XX 가 Discrete 하다면 다음과 같이 전개가 됩니다.

E[g(X)]=∫−∞∞g(x)dF(x)=∑x∈Xg(x)fX(x)dx\mathbb{E}\left[g(X) \right] = \int_{-\infty}^\infty g(x) dF(x) = \sum_{x \in X} g(x) f_X(x) dx

Riemann-Stieltjes Integral 에 르베그 분해법을 활용한다면, 다음과 같이도 전개가 가능합니다.

F=Fac+Fd+FscF = F_{ac} + F_d + F_{sc}
  • FacF_{ac} : 절대적으로 연속인 구간에 대한 CDF
  • FdF_d : 이산적인 구간의 CDF
  • FscF_{sc} : 특이연속인 구간에 대한 CDF

이렇게 정의하게 된다면 엄밀히 따졌을 때 기댓값을 다음과 같이 정의할 수 있습니다.

E[g(X)]=∫−∞∞g(x)dF(x) =∫x∈acg(x)fX(x)dx+∑x∈dg(x)P(X=x)+∫x∈scg(x)dFsc\mathbb{E}\left[g(X) \right] = \int_{-\infty}^\infty g(x) dF(x) \\~\\= \int_{x \in ac} g(x) f_X(x) dx + \sum_{x \in d} g(x) \mathbb{P}(X = x) + \int_{x \in sc} g(x) dF_{sc}

어쨌든 본론으로 돌아오자면 저희가 CDF 을 Measure 으로 사용해서 얻는 가장 큰 이점은 바로 균일 분포에서의 샘플링을 통해서 CDF 를 구할 수가 있다는 것입니다.

예시로 Xi∼i.i.dF,  i=[n]X_i \stackrel{\text{i.i.d}}{\sim} F, \; i=[n] 이라고 하겠습니다. 그러면 FF 를 추정하기 위해서 Empirical CDF FeF_e 를 다음과 같이 정의하겠습니다.

Fe(x):=#{i:Xi≤x}n→w.p 1F(x),  by SLLNF_e(x) := \frac{\#\{ i: X_i \le x \}}{n} \stackrel{\text{w.p } 1}{\rightarrow} F(x), \; \text{by SLLN}

이때 저희는 그러면 Monte-Carlo Integration 에서 평균을 사용하듯이 CDF 를 추정하면 되며, 이에 대한 이유는 다음과 같습니다.

이유 1 :

E[Fe(x)]=1n⋅E[#{i:Xi≤x}]=1n⋅E[∑i=1n1(Xi≤x)]=1n∑i=1nE[1(Xi≤x)]=1n⋅∑i=1nP(Xi≤x)=P(X1≤x)=F(x),Fe(x)→F(x)\begin{aligned} \mathbb{E}\left[F_e(x) \right] &= \frac 1 n \cdot \mathbb{E}\left[ \#\{i: X_i\le x \} \right] = \frac 1 n \cdot \mathbb{E}\left[ \sum_{i=1}^n \mathbb{1} (X_i \le x) \right] \\ &= \frac 1 n \sum_{i=1}^n \mathbb{E}\left[\mathbb{1}(X_i \le x) \right] = \frac 1 n \cdot \sum_{i=1}^n \mathbb{P}(X_i \le x) = \mathbb{P}(X_1 \le x) = F(x), \\ &F_e(x) \rightarrow F(x) \end{aligned}

이유 2 :

∫g(x)dFe(x)=1n⋅∑i=1ng(Xi)\int g(x) d F_e(x) = \frac{1}{n} \cdot \sum_{i=1}^n g(X_i)
정성현 교수님 통계전산 강의안 1
  • 각각의 Jump 들의 높이는 1n\frac 1 n 이다.
  • x-축의 각각 데이터는 샘플링한 XiX_i 값들이다.
  • 이렇게 진행되면 일반적인 Riemann Integral 보다 CDF Property 를 잘 반영해서 추정할 수 있게 된다.

Beyond Integral

사실 적분 뿐만 아니라 Monte Carlo Simulation 은 꽤나 다양하게 사용될 수가 있다.

  • 기댓값을 활용한 다른 값들, 예시로 분산.
  • 어떠한 분포에 대한 Sample Quantiles.
  • 어떠한 확률변수의 분포밀도.