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

Inverse Transform Sampling (역 변환 샘플링)

by Jayce_choi 2023. 4. 21.
반응형

Inverse Transform Sampling

Uniform distribution에서 내가 알고 싶은 분포를 무작위 추출 (Random Sampling)이 가능하도록 바꿔주는 방법입니다. 

 

우선 샘플링의 의미는 어떤 특정 분포를 따르는 무작위 샘플을 생성하는 것을 의미하며, 모집단에서 표본을 추출하는 일입니다. 

우리에게 익숙한 개념들이 있습니다. PDF (확률밀도함수)는 각 입력값 x에 따른 확률 밀도를 알려주는 함수입니다. CDF (누적밀도함수)의 단점은 어떤 값이 더 자주 나오는지 모르지만 PDF는 CDF를 미분하여서 각 구간 변화의 정도를 얻을 수 있으며 해당 값들의 연속이 결국 어떤 값의 정도를 확인할 수 있습니다. 

그러나 PDF 또는 CDF를 통해서는 샘플링이 불가능합니다. 두 함수가 확률 분포를 나타내는 수학적 모델에 불가하며, 변수 x가 특정한 값일 때의 확률을 나타내기 때문입니다. 즉, 특정 x에 대한 확률을 아는것과 데이터에 대한 샘플링이 가능한 것은 다른 문제입니다. 

확률 분포 (CDF 또는 PDF)는 확률 변수 값 x를 넣어줬을 때 출력으로 확률 값을 줍니다. 그러나 우리가 얻고자 하는건 CDF 또는 PDF의 x축에 있는 확률변수 값 (표본)이므로 역으로 접근해야 합니다. 확률 값을 넣어 줬을 때 확률 변수 값을 얻을 수 있도록 해야 하며 때문에 역함수가 필요합니다.

 

Process of Inverse Transform

  1. 확률 분포 결정하기 (랜덤 변수를 생성할 확률 분포를 선택합니다)
  2. 구하고자 하는 분포의 CDF (Cumulative Distribution Function)를 계산
  3. CDF의 역함수를 계산
  4. 0~1 사이의 균일한 분포 (Uniform Distribution)에서 무작위 값 생성
  5. 무작위 값을 이용하여 역 CDF에 대입하여 확률 분포에서 무작위 샘플을 생성함. 

Proof of Inverse Transform Method

*이때 확률값은 보통 균일 분포 (Uniform Distribution)에서 0~1 사이의 무작위 값을 사용하며 균일분포는 제일 샘플링하기 쉬운 분포라서 사용합니다.

*또한 CDF를 사용하는 이유는 단조 증가 함수 (감소하지 않고 줄곧 왼쪽으로 오른쪽으로 상승)이기에 한 개의 y값에 한 개의 x값이 대응되는 1:1 대응이기 때문입니다. 또한 PDF를 적분하면 CDF가 되며 적분 과정을 통해서 PDF보다 식 계산이 더 간편해지기 때문입니다.

*하지만 해당 방법을 이용하기 위해서는 CDF가 역변환이 가능해야하며 또한 연속적 (Continuous) 해야 합니다.

 

Example

예를 들어서 F(x)라는 CDF함수가 Exponential Distribution을 가지며 다음과 같은 식을 가지고 있다고 가정하겠습니다. 

 

이때 Uniform Distribution을 따르는 u값을 이용해서 Sampling을 해야 하므로 해당 u값은 F함수의 y값 (확률)이 되겠습니다.

 

그리고 역함수를 구하게 되면 아래와 같이 되며.. 

 

u값이 들어갔을 때 우리는 무작위로 x를 만들 수가 있습니다. 한번 코드로 결과를 보겠습니다. 

import matplotlib.pyplot as plt
import numpy as np

def exp_cdf(x):
    return 1 - np.exp(-0.5*x)

def exp_pdf(x):
    return 0.5 * np.exp(-0.5 * x)

def exp_cdf_inv(u):
    return -2 * np.log(1-u)

sample = []
prob = []
pdf = []
n = 1000000
x = np.linspace(0, 10, n)
for i in range(n):
    u = np.random.uniform(0, 1)
    sample.append(exp_cdf_inv(u))
    prob.append(u)
    pdf.append(exp_pdf(x[i]))
plt.plot(x, pdf,'r-', label='PDF, f(x)') # pdf
plt.hist(sample, bins=100, density=True, label='Sample from Inverse function')
plt.xlim(0,10)
plt.legend()
plt.savefig('exp_cdf_inv.png', dpi = 300)

결과는 다음과 같습니다. 파란색은 히스토그램이며 Inverse CDF를 통해서 얻은 결과입니다. 그리고 빨간색은 Reference 선인 PDF입니다. 결과적으로 잘 추정하는 것을 볼 수가 있었습니다.

반응형

댓글