Source code for binf.example.samplers
import numpy as np
from collections import namedtuple
RWMCSampleStats = namedtuple('RWMCSampleStats', 'acceptance_rate')
[docs]class GammaSampler(object):
def __init__(self, pdf, state):
self.pdf = pdf
self.state = state
[docs] def _get_prior(self):
from binf.example.priors import GammaPrior
prior = filter(lambda p: 'precision' in p.variables,
self.pdf.priors.values())[0]
print prior
if not isinstance(prior, GammaPrior):
msg = 'Prior for precision is not a Gamma distribution'
raise NotImplementedError(msg)
return prior
[docs] def _calculate_shape(self):
prior = self._get_prior()
n_data_points = len(self.pdf.likelihoods['points'].error_model.ys)
return 0.5 * n_data_points + prior.shape - 1
[docs] def _calculate_rate(self):
args = dict(coefficients=self.pdf['coefficients'].value,
precision=1.0)
r1 = -self.pdf.likelihoods['points'].log_prob(**args)
r2 = self._get_prior().rate
return r1 + r2
[docs] def sample(self, state=42):
rate = self._calculate_rate()
shape = self._calculate_shape()
sample = np.random.gamma(shape) / rate
self.state = sample
return self.state
[docs]class RWMCSampler(object):
def __init__(self, pdf, state, stepsize):
self.pdf = pdf
self.state = state
self.stepsize = stepsize
self._n_moves = 0
self._n_accepted_moves = 0
@property
def last_draw_stats(self):
return {'coefficients': RWMCSampleStats(self.acceptance_rate)}
@property
def acceptance_rate(self):
if self._n_moves > 0:
return self._n_accepted_moves / float(self._n_moves)
else:
return 0.0
[docs] def sample(self):
E_old = -self.pdf.log_prob(coefficients=self.state)
change = np.random.uniform(low=-self.stepsize, high=self.stepsize,
size=len(self.state))
proposal = self.state + change
E_new = -self.pdf.log_prob(coefficients=proposal)
accepted = np.random.random() < np.exp(-(E_new - E_old))
if accepted:
self.state = proposal
self._n_accepted_moves += 1
self._n_moves += 1
return self.state
[docs]def make_sampler(posterior, rwmc_stepsize, start_state):
from binf.samplers.gibbs import GibbsSampler
coeffs = start_state.variables['coefficients']
precision = start_state.variables['precision']
coefficients_pdf = posterior.conditional_factory(precision=precision)
coefficients_sampler = RWMCSampler(coefficients_pdf,
coeffs,
rwmc_stepsize)
precision_pdf = posterior.conditional_factory(coefficients=coeffs)
precision_sampler = GammaSampler(precision_pdf, precision)
subsamplers = {'coefficients': coefficients_sampler,
'precision': precision_sampler}
return GibbsSampler(posterior, start_state, subsamplers)