Source code for binf.example.priors
import numpy as np
from csb.statistics.pdf.parameterized import Parameter as ScalarParameter
from binf import ArrayParameter
from binf.pdf.posteriors import Posterior
from binf.pdf.priors import AbstractPrior
[docs]class GammaPrior(AbstractPrior):
def __init__(self, shape, rate):
super(GammaPrior, self).__init__('precision_prior')
self.shape = shape
self.rate = rate
self._register_variable('precision')
self.update_var_param_types(precision=ScalarParameter)
self._set_original_variables()
[docs] def _evaluate_log_prob(self, precision):
return (self.shape - 1.0) * np.log(precision) - precision * self.rate
[docs] def clone(self):
copy = self.__class__(self.shape, self.shape)
copy.set_fixed_variables_from_pdf(self)
return copy
[docs]class GaussianPrior(AbstractPrior):
def __init__(self, means, variances):
super(GaussianPrior, self).__init__('coefficients_prior')
self._register('means')
self._register('variances')
self['means'] = ArrayParameter(means, 'means')
self['variances'] = ArrayParameter(variances, 'variances')
self._register_variable('coefficients')
self.update_var_param_types(coefficients=ArrayParameter)
self._set_original_variables()
[docs] def _evaluate_log_prob(self, coefficients):
means = self['means'].value
variances = self['variances'].value
return -0.5 * np.sum((coefficients - means) ** 2 / variances)
[docs] def _evaluate_gradient(self, **variables):
coeff = variables[self.variable_name]
return (coeff - self['mu'].value) / self['sigma'].value ** 2
[docs] def clone(self):
return self.__class__(self['means'].value, self['variances'].value)
[docs]def make_priors():
PP = GammaPrior(1.0, 0.2)
CP = GaussianPrior(means=np.array([2.0, -1.0, 1.0, 0.5]), variances=np.ones(4) * 5)
CP = GaussianPrior(means=np.array([0.0, 0.0, 0.0, 0.0]), variances=np.ones(4) * 5)
return {PP.name: PP, CP.name: CP}