Source code for rexfw.samplers.rwmc

'''
A Metropolis-Hastings sampler as an example for the sampler interface
'''

import numpy as np
from collections import namedtuple

from rexfw.samplers import AbstractSampler


RWMCSampleStats = namedtuple('RWMCSampleStats', 'accepted total stepsize')


[docs]class RWMCSampler(AbstractSampler): def __init__(self, pdf, state, stepsize, variable_name='x'): super(RWMCSampler, self).__init__(pdf, state, variable_name) self.stepsize = stepsize self._last_move_accepted = False self._n_moves = 0 @property def last_draw_stats(self): return {self.variable_name: RWMCSampleStats(self._last_move_accepted, self._n_moves, self.stepsize)}
[docs] def sample(self): E_old = -self.pdf.log_prob(self.state) proposal = self.state + np.random.uniform(low=-self.stepsize, high=self.stepsize) E_new = -self.pdf.log_prob(proposal) accepted = np.random.random() < np.exp(-(E_new - E_old)) if accepted: self.state = proposal self._last_move_accepted = True else: self._last_move_accepted = False self._n_moves += 1 return self.state