using Distributions
n = 50000# sample size
z₀ = 4.0for i in1:5
z = rand(Normal(), n) # n-samples drawn from a standard normal distribution
est_MC = sum(z .> z₀)/n # estmiates using Monte Carlo
println(est_MC)
end
4.0e-56.0e-50.04.0e-54.0e-5
다섯번 정도 해보면 계산된 값이 참값과 비슷하지 않고, 심지어는 0으로 계산될 때도 있다. 이런 부정확함은 표준정규분포의 꼬리가 너무 얇기 때문에 생긴다. 종이 위에서 적분할 때는 꼬리가 아무리 얇아도 그에 대한 계산이 적분에 포함되지만, 컴퓨터로 샘플링할 때는 유한한 샘플만을 다루기 때문에 너무 발생확률이 낮은 사건은 계산에 포함되지 않을 수 있다. 물론 n을 늘리면 더 정확해질테지만 이는 너무 당연한 말이고, 이런걸 해결방법이라고 부르지는 않는다.
이제 확률밀도함수가 p인 확률변수 X에 대해서, f(X)의 기댓값을 계산하는 상황을 생각해보자. 이는 위 식의 좌변과 같이 계산할 수 있는데, 여기서 어떤 q(x)를 나눠주고 곱해줘도 여전히 같은 값이다. 식의 우변은 좌변과 같은 값을 갖지만, 의미는 '확률밀도함수가 q인 확률변수 X에 대해서 f(X)q(X)p(X)의 기댓값'이 된다. 여기서 q를 p보다 꼬리가 두꺼운 확률밀함수로 선택한다면, 발생확률이 너무 낮은 사건에 의한 부정확함을 줄일 수 있다.
정의
X를 확률밀도함수가 p인 확률변수라고 하자. q를 다음을 만족하는 또 다른 확률밀도함수라고 하자.
suppp⊂suppq(⟺q=0 if p=0)
중요도 샘플링importance sampling이란 f(X)의 기댓값 Ep[f(X)]를 Eq[f(X)q(X)p(X)]로 계산하여 구하는 방법을 말한다. 이때 supp는 함수의 서포트이다.
여기서 q를 제안 분포proposal distribution, w=qp를 중요도 가중치importance weight라고 한다.
설명
다시말해 중요도 샘플링이란 몬테카를로 적분을 다음과 같이 계산하는 것이다.
n1∑f(xi)q(xi)p(xi),Xi∼q(x)(instead of n1∑f(xi),Xi∼p(x))
다음과 같이 사용하면 도움이 된다.
빌드업에서의 예제와 같이 p(x)의 꼬리가 너무 얇을 때 서포트가 더 큰 분포를 제안함수로 둔다.
p(x)의 분포로 샘플링 하기 어려울 때 샘플링하기 쉬운 분포를 제안함수를 q(x)로 둔다.
q가 p의 분모로 곱해지기 때문에 suppq는 suppp를 포함해야한다.
빌드업의 적분 (1)을 코시분포를 제안분포로 두고 중요도 샘플링으로 다시 계산한 결과는 다음과 같다.
# Julia code
using Distributions
n = 50000# sample size
z₀ = 4.0for i in1:5
z = rand(Cauchy(), n) # n-samples drawn from a Cauchy distribution
w = pdf.(Normal(), z) ./ pdf.(Cauchy(), z)
est_IS = sum(w[z .> z₀])/n # estmiates using Importance Sampling
println(est_IS)
end
3.0330744703037005e-53.1808448538011614e-53.049259883894785e-53.305423127141489e-53.1807695818207125e-5
개구간 III 에서 함수 ϕ\phiϕ 가 컨벡스하고 두 번 미분가능, 확률변수 XXX 의 기댓값 μ\muμ 가 존재하며 X⊂IX \subset I X⊂I 면
ϕ[E(X)]≤E[ϕ(X)]
\phi [ E(X) ] \le E [ \phi (X)]
ϕ[E(X)]≤E[ϕ(X)]