MCMC toolbox » Examples » Three modes example

Metropolis-Hastings MCMC may have troubles if the target distributio has multiple modes. Here we test with a target, which is 4 dimensional mixed Gaussian with 3 distinct modes. By changing the scaling of DRAM, we find all the modes of this example.

clear model options params

nsimu = 50000; % how many simulations
npar = 4;
mu1  = [-8,-8,-8,-8];
mu2  = [ 0, 0, 0, 0];
mu3  = [ 8, 8, 8, 8];
sigs = [ 1, 1, 1, 1];
w    = [0.1, 0.3, 0.6]; % 3 mixture weights

model.ssfun= @(x,d) -2*log(w(1)*mvnorpf(x,mu1,sigs)+w(2)*mvnorpf(x,mu2,sigs)+w(3)*mvnorpf(x,mu3,sigs));

% DRAM, first large, then small
options.nsimu    = nsimu;
options.method   = 'dram';
options.qcov     = eye(npar)*5^2;
options.drscale  = 5;
options.adascale = 2.4 / sqrt(npar) * 5;
for i=1:npar, params{i} = {sprintf('x_{%d}',i), 0}; end

[res,chain] = mcmcrun(model,[],params,options);
Sampling these parameters:
name   start [min,max] N(mu,s^2)
x_{1}: 0 [-Inf,Inf] N(0,Inf)
x_{2}: 0 [-Inf,Inf] N(0,Inf)
x_{3}: 0 [-Inf,Inf] N(0,Inf)
x_{4}: 0 [-Inf,Inf] N(0,Inf)
figure(1); clf; mcmcplot(chain,[],res,'chainpanel')
figure(2); clf; mcmcplot(chain,[],res,'denspanel')
figure(3); clf
mcmcplot(chain,[1],res,'hist')
xx = linspace(-14,14,200)';
yy = w(1)*norpf(xx,mu1(1),sigs(1)) + w(2)*norpf(xx,mu2(1),sigs(1)) + w(3)*norpf(xx,mu3(1),sigs(1));
hold on
plot(xx,yy,'-')
hold off
xlabel('x_1')
title('3 modes in 4 dimensional Gaussian mixtures')