import numpy as np
import scipy.stats
from matplotlib import pyplot as plt
from IPython.core.pylabtools import figsize
%matplotlib inline
Variance reduction by importance sampling
https://www.math.nyu.edu/faculty/goodman/teaching/StochCalc2012/notes/Week10.pdf
# We want to estimate the rare event
# N(0,1)>gamma
# crude monte carlo has high variance
gamma = 3.
nb_samples = 10000
X = np.random.normal(size=nb_samples)
(X>gamma).sum()/nb_samples
TODO: as exercise
def likelihood_ratio(X, mu_u=0, mu_v=gamma):
assert mu_u==0
return np.exp(mu_v**2/2) * np.exp(-mu_v*X)
#### importance sampling - low variance
mu_v=gamma
X = np.random.normal(loc=mu_v, size=nb_samples)
X_ = X[X>gamma]
#### imprtance sampling estimator has lower variance
likelihood_ratio(X_).sum() / nb_samples
likelihood_ratio(X_)