Python codes for Sequential Monte Carlo sampling Technique.
This technique is robust in sampling close to 1000-dimensions posterior probability densities.
Uses numpy, scipy and collections libraries.
We draw samples from a bivariate bimodal Gaussian probability density as shown below:
The two modes for first parameter (par 1) is at [2 10], while for the second
parameter (par 2) is at [6 12]. The corresponding standard deviation are
[2 1] for par 1 and [2 1] for par 2, respectively.
postt calculates the log of the target distribution.
import numpy as np
from scipy.stats import multivariate_normal
mu1 = np.array([2,12])
sigma1 = np.array([2,1])
mvn1 = multivariate_normal(mu1,sigma1)
mu2 = np.array([10,6])
sigma2 = np.array([1,2])
mvn2 = multivariate_normal(mu2,sigma2)
postt = lambda x: np.log((mvn1.pdf(x)+mvn2.pdf(x))/ \
(mvn1.pdf(mu1)+mvn2.pdf(mu2)))
Import the collections library.
from collections import namedtuple
Create two named tuple objects: opt and samples.
opt corresponds to input parameters of the sampling technique. opt.N is the
number of Markov chains, opt.Neff is the chain length, opt.LB is the lower
bound of the target distribution parameters, and opt.UB is the upper bound.
samples corresponds to the information of the samples at each intermediate
stage. samples.allsamples is the ensemble of samples at final stage, samples.postval
is the log of target distribution values, samples.stage is the array of all
the stages, samples.beta is the array of beta parameters, samples.covsmpl is
the sample covariance at final stage, samples.resmpl is the resampled samples
at the final stage.
NT1 = namedtuple('NT1', 'N Neff target LB UB')
opt = NT1(2000, 50, postt, np.array([0,0]), np.array([15,15]))
NT2 = namedtuple('NT2', 'allsamples postval beta stage covsmpl resmpl')
samples = NT2(None, None, None, None, None, None)
Run this line to get all the samples.
final = SMC_samples(opt,samples, NT1, NT2)
plt.subplot(1, 2, 1)
n, bins, patches = plt.hist(final.allsamples[:,0], 50, density=True, \
facecolor='b', alpha=0.75)
plt.subplot(1, 2, 2)
n, bins, patches = plt.hist(final.allsamples[:,1], 50, density=True, \
facecolor='b', alpha=0.75)
