Computing the acceptance-fraction of the rejection sampler

In [1]:
%matplotlib inline
%config IPython.matplotlib.backend = "retina"
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams["figure.dpi"] = 150
rcParams["savefig.dpi"] = 150
import tqdm
In [2]:
import scipy.special as sps
import numpy as np
import math
from maoud.sampling import rejection_sampling
from maoud.distributions import AlphaMu
In [3]:
x = np.linspace(1e-3, 3., 1000)
alpha, mu = 10, 4.25
nakagami = AlphaMu(alpha, mu)
pdf = nakagami.pdf(x)
plt.plot(x, pdf)
plt.ylabel("Probability density")
plt.xlabel("Support")
plt.title(r"$\alpha-\mu$ density")
Out[3]:
Text(0.5,1,'$\\alpha-\\mu$ density')
../_images/ipython_notebooks_acceptance_fraction_3_1.png
In [4]:
n_samples = 1e6
nakagami_samples, af = rejection_sampling(nakagami.pdf, x, n_samples)
In [5]:
plt.plot(x, pdf)
_ = plt.hist(nakagami_samples, bins=50, density=True)
../_images/ipython_notebooks_acceptance_fraction_5_0.png
In [6]:
mu_list = np.linspace(.75, 4.25, 6)
alpha_list = np.linspace(1, 10, 20)
acceptance_fraction = np.zeros((len(mu_list), len(alpha_list)))
for i, mu in enumerate(mu_list):
    for j, alpha in enumerate(alpha_list):
        nakagami = AlphaMu(alpha, mu)
        _, af = rejection_sampling(nakagami.pdf, x, n_samples)
        acceptance_fraction[i, j] = np.mean(af)
In [7]:
plt.plot(alpha_list, acceptance_fraction.T)
Out[7]:
[<matplotlib.lines.Line2D at 0x103615278>,
 <matplotlib.lines.Line2D at 0x103615438>,
 <matplotlib.lines.Line2D at 0x103615588>,
 <matplotlib.lines.Line2D at 0x1036156d8>,
 <matplotlib.lines.Line2D at 0x103615828>,
 <matplotlib.lines.Line2D at 0x103615978>]
../_images/ipython_notebooks_acceptance_fraction_7_1.png