Ejemplo n.º 1
0
def test_UniformPrior():
    lower = 2
    upper = 4
    P1 = UniformPrior(lower=lower, upper=upper, variable_indices=[0])

    # Check some basic properties
    assert P1.lower == lower
    assert P1.upper == upper
    assert P1.bounds == [(lower, upper)]

    # Check sampling produces expected distribution
    sample = array([P1.sample() for _ in range(100)])
    assert all(sample >= lower)
    assert all(sample <= upper)

    # Check that probability is constant within the range
    theta_in_range = linspace(lower, upper, endpoint=True)
    log_probability = [P1(array([i])) for i in theta_in_range]
    assert all(log_probability == log_probability[0])
    assert exp(log_probability[0]) == 1.0 / (upper - lower)

    # Check that the probability is very small outside the range
    theta_left_range = linspace(-15, lower, endpoint=False)
    log_probability_left = array([P1(array([i])) for i in theta_left_range])
    assert all(log_probability_left < -1e32)
    theta_right_range = linspace(upper + 1e-5, 15)
    log_probability_right = array([P1(array([i])) for i in theta_right_range])
    assert all(log_probability_right < -1e32)
Ejemplo n.º 2
0
def test_UniformPrior_gradient():
    # test combining multiple uniforms
    P1 = UniformPrior(lower=2, upper=4, variable_indices=[0])
    P2 = UniformPrior(lower=4, upper=8, variable_indices=[1])
    P3 = UniformPrior(lower=[8, 16], upper=[16, 32], variable_indices=[2, 3])
    combo = UniformPrior.combine([P1, P2, P3])
    # evaluate the prior at a test point
    test_point = array([3.0, 5.0, 15.0, 19.0])
    # check the analytic gradient calculation against finite difference
    analytic_gradient = combo.gradient(test_point)
    numeric_gradient = finite_difference(
        func=combo, x0=test_point, vectorised_arguments=True
    )
    assert allclose(analytic_gradient, numeric_gradient)
Ejemplo n.º 3
0
def test_UniformPrior_combine():
    # test combining multiple uniforms
    P1 = UniformPrior(lower=2, upper=4, variable_indices=[0])
    P2 = UniformPrior(lower=4, upper=8, variable_indices=[1])
    P3 = UniformPrior(lower=[8, 16], upper=[16, 32], variable_indices=[2, 3])
    combo = UniformPrior.combine([P1, P2, P3])
    # check the combined distribution has the right values
    assert (combo.lower == array([2.0, 4.0, 8.0, 16.0])).all()
    assert (combo.upper == array([4.0, 8.0, 16.0, 32.0])).all()
    assert combo.bounds == [(2, 4), (4, 8), (8, 16), (16, 32)]
    assert combo.variables == [0, 1, 2, 3]

    # Check sampling produces expected distribution
    sample = array([combo.sample() for _ in range(100)])
    for index in combo.variables:
        assert all(sample[:, index] >= combo.lower[index])
        assert all(sample[:, index] <= combo.upper[index])
Ejemplo n.º 4
0
def test_JointPrior_gradient():
    P1 = ExponentialPrior(beta=10, variable_indices=[1])
    P2 = GaussianPrior(mean=20, sigma=2, variable_indices=[0])
    P3 = UniformPrior(lower=8, upper=16, variable_indices=[2])
    JP = JointPrior(components=[P1, P2, P3], n_variables=3)
    test_point = array([4.0, 23.0, 12.0])
    analytic_gradient = JP.gradient(test_point)
    numeric_gradient = finite_difference(
        func=JP, x0=test_point, vectorised_arguments=True
    )
    assert allclose(analytic_gradient, numeric_gradient)
Ejemplo n.º 5
0
def test_JointPrior():
    P1 = ExponentialPrior(beta=10, variable_indices=[1])
    P2 = GaussianPrior(mean=20, sigma=2, variable_indices=[0])
    P3 = UniformPrior(lower=8, upper=16, variable_indices=[2])
    components = [P1, P2, P3]
    JP = JointPrior(components=components, n_variables=3)

    sample = array([JP.sample() for _ in range(1000)])
    assert sample.shape[1] == len(components)
    assert isclose(sample[:, 0].mean(), P2.mean, rtol=0.2)
    assert isclose(sample[:, 0].std(), P2.sigma, rtol=0.2)
    for index, (lower, upper) in enumerate(JP.bounds):
        if lower is not None:
            assert all(sample[:, index] >= lower)
        if upper is not None:
            assert all(sample[:, index] <= upper)
Ejemplo n.º 6
0
# We could at this stage pair the likelihood object with an optimiser in order to obtain
# the maximum-likelihood estimate of the parameters. In this example however, we want to
# construct the posterior distribution for the model parameters, and that means we need
# a prior.

# The inference.priors module contains classes which allow for easy construction of
# prior distributions across all model parameters.
from inference.priors import ExponentialPrior, UniformPrior, JointPrior

# If we want different model parameters to have different prior distributions, as in this
# case where we give three variables an exponential prior and one a uniform prior, we first
# construct each type of prior separately:
prior_components = [
    ExponentialPrior(beta=[50., 20., 20.], variable_indices=[0, 1, 3]),
    UniformPrior(lower=0., upper=12., variable_indices=[2])
]
# Now we use the JointPrior class to combine the various components into a single prior
# distribution which covers all the model parameters.
prior = JointPrior(components=prior_components, n_variables=4)

# As with the likelihood, prior objects can also be called as function to return a
# log-probability value when passed a vector of model parameters. We can also draw
# samples from the prior directly using the sample() method:
prior_sample = prior.sample()
print(prior_sample)

# The likelihood and prior can be easily combined into a posterior distribution
# using the Posterior class:
from inference.posterior import Posterior
posterior = Posterior(likelihood=likelihood, prior=prior)
Ejemplo n.º 7
0
def test_JointPrior_repeat_variable():
    P1 = ExponentialPrior(beta=10, variable_indices=[0])
    P2 = GaussianPrior(mean=20, sigma=2, variable_indices=[0])
    P3 = UniformPrior(lower=8, upper=16, variable_indices=[2])
    with pytest.raises(ValueError):
        JointPrior(components=[P1, P2, P3], n_variables=3)
Ejemplo n.º 8
0
def test_UniformPrior_bad_upper():
    with pytest.raises(ValueError):
        UniformPrior(lower=zeros(2), upper=[1.0, 0.0], variable_indices=[0])
Ejemplo n.º 9
0
def test_UniformPrior_inconsistent_dimensions():
    with pytest.raises(ValueError):
        UniformPrior(lower=zeros((2, 2)), upper=ones(4), variable_indices=[0])

    with pytest.raises(ValueError):
        UniformPrior(lower=zeros(4), upper=ones((2, 2)), variable_indices=[0])
Ejemplo n.º 10
0
def test_UniformPrior_inconsistent_size():
    with pytest.raises(ValueError):
        UniformPrior(lower=zeros(1), upper=ones(2), variable_indices=[0])