Source code for pints._mcmc._haario_ac
#
# Adaptive covariance MCMC method by Haario
#
# This file is part of PINTS (https://github.com/pints-team/pints/) which is
# released under the BSD 3-clause license. See accompanying LICENSE.md for
# copyright notice and full license details.
#
import pints
import numpy as np
[docs]class HaarioACMC(pints.AdaptiveCovarianceMC):
"""
Adaptive Metropolis MCMC, which is algorithm 4 in [1]_ and is described in
the text in [2]_.
This algorithm differs from :class:`HaarioBardenetACMC` only through its
use of ``alpha`` in the updating of ``log_lambda`` (rather than a binary
accept/reject).
Initialise::
mu
Sigma
adaptation_count = 0
log lambda = 0
In each adaptive iteration (t)::
adaptation_count = adaptation_count + 1
gamma = (adaptation_count)^-eta
theta* ~ N(theta_t, lambda * Sigma)
alpha = min(1, p(theta*|data) / p(theta_t|data))
u ~ uniform(0, 1)
if alpha > u:
theta_(t+1) = theta*
accepted = 1
else:
theta_(t+1) = theta_t
accepted = 0
mu = (1 - gamma) mu + gamma theta_(t+1)
Sigma = (1 - gamma) Sigma + gamma (theta_(t+1) - mu)(theta_(t+1) - mu)
log lambda = log lambda + gamma (alpha - self._target_acceptance)
gamma = adaptation_count^-eta
Extends :class:`AdaptiveCovarianceMC`.
References
----------
.. [1] A tutorial on adaptive MCMC
Christophe Andrieu and Johannes Thoms, Statistical Computing, 2008,
18: 343-373.
https://doi.org/10.1007/s11222-008-9110-y
.. [2] An adaptive Metropolis algorithm
Heikki Haario, Eero Saksman, and Johanna Tamminen (2001) Bernoulli.
"""
def __init__(self, x0, sigma0=None):
super(HaarioACMC, self).__init__(x0, sigma0)
self._log_lambda = 0
def _adapt_internal(self, accepted, log_ratio):
""" See :meth:`pints.AdaptiveCovarianceMC._adapt()`. """
p = np.exp(log_ratio) if log_ratio < 0 else 1
self._log_lambda += self._gamma * (p - self._target_acceptance)
def _generate_proposal(self):
""" See :meth:`AdaptiveCovarianceMC._generate_proposal()`. """
return np.random.multivariate_normal(
self._current, self._sigma * np.exp(self._log_lambda))
[docs] def name(self):
""" See :meth:`pints.MCMCSampler.name()`. """
return 'Haario adaptive covariance MCMC'