Unknownpgr

Importance Sampling

2023-09-01 13:53:39 | Korean

Importance Sampling : 샘플링이 어려운 확률변수 p(x)p(x)에 대하여, 샘플링이 용이한 확률변수 q(x)q(x)를 통해 xp(x)x\sim p(x)일 때 f(x)f(x)의 기댓값을 추정하는 방법.

증명

Exp(x)[f(x)]=f(x)p(x)dx=f(x)p(x)q(x)q(x)dx=Exq(x)[p(x)q(x)f(x)]\begin{aligned} \mathbb{E}_{x\sim p(x)}[f(x)] &= \int f(x)p(x)dx \\ &= \int f(x)\frac{p(x)}{q(x)}q(x)dx \\ &= \mathbb{E}_{x\sim q(x)}\left[\frac{p(x)}{q(x)}f(x)\right] \end{aligned}

예시

확률분포 p(x)=ex2πp(x)=\frac{e^{-x^2}}{\sqrt{\pi}}에 대하여, xp(x)x\sim p(x)일 때 f(x)=x2f(x)=x^2의 기댓값을 추정하고자 한다.

이때 p(x)p(x)는 적분이 어려운 함수이므로 이로부터 샘플링하기 쉽지 않다.

따라서 q(x)=N(0,1)q(x)=\mathcal{N}(0,1)로부터 샘플링하여 f(x)f(x)의 기댓값을 추정해보자.

아래와 같은 코드를 통해 기댓값을 추정할 수 있다.

import numpy as np


def func(x):
    return x**2


def p(x):
    return np.exp(-(x**2)) / (np.sqrt(np.pi))


def q(x):
    # Return proboability density function of a normal distribution
    return np.exp(-(x**2) / 2) / (np.sqrt(2 * np.pi))


# Sample from a normal distribution, sample size = 10000
mu = 0
sigma = 1
sample_size = 100000
sample = np.random.normal(mu, sigma, sample_size)

# Calculate the expectation
expectation = np.mean(func(sample) * p(sample) / q(sample))
print(expectation)

출력은 0.5008740539678816로, 거의 0.5에 가까운 값이다.


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -