Example #1
0
def test_can_specify_a_gaussian_proposal_distribution(net: BayesNet) -> None:
    algo = MetropolisHastingsSampler(proposal_distribution="gaussian",
                                     latents=net.iter_latent_vertices(),
                                     proposal_distribution_sigma=np.array(1.))
    generate_samples(net=net,
                     sample_from=net.iter_latent_vertices(),
                     sampling_algorithm=algo)
Example #2
0
def test_can_iter_through_samples(algo: str, net: BayesNet) -> None:
    draws = 10
    samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo=algo, down_sample_interval=1)
    count = 0
    for sample in islice(samples, draws):
        count += 1
    assert count == draws
Example #3
0
def test_iter_returns_same_result_as_sample() -> None:
    draws = 100
    model = thermometers.model()
    net = BayesNet(model.temperature.iter_connected_graph())
    set_starting_state(model)
    sampler = MetropolisHastingsSampler(proposal_distribution='prior',
                                        latents=net.iter_latent_vertices())
    samples = sample(net=net,
                     sample_from=net.iter_latent_vertices(),
                     sampling_algorithm=sampler,
                     draws=draws)
    set_starting_state(model)
    sampler = MetropolisHastingsSampler(proposal_distribution='prior',
                                        latents=net.iter_latent_vertices())
    iter_samples = generate_samples(net=net,
                                    sample_from=net.iter_latent_vertices(),
                                    sampling_algorithm=sampler)

    samples_dataframe = pd.DataFrame()
    for iter_sample in islice(iter_samples, draws):
        samples_dataframe = samples_dataframe.append(iter_sample,
                                                     ignore_index=True)

    for vertex_label in samples_dataframe:
        np.testing.assert_almost_equal(samples_dataframe[vertex_label].mean(),
                                       np.average(samples[vertex_label]))
Example #4
0
def test_iter_with_live_plot(net: BayesNet) -> None:
    KeanuRandom.set_default_random_seed(1)
    _, ax = plt.subplots(3, 1, squeeze=False)
    samples = generate_samples(net=net,
                               sample_from=net.get_latent_vertices(),
                               live_plot=True,
                               refresh_every=5,
                               ax=ax)

    for sample in islice(samples, 5):
        pass

    reorder_subplots(ax)

    assert len(ax) == 3
    assert all(len(ax[i][0].get_lines()) == 1 for i in range(3))

    assert np.allclose(
        ax[0][0].get_lines()[0].get_ydata(),
        [0.49147822, 0.49147822, 0.49147822, 0.20033212, 0.20033212])
    assert np.allclose(
        ax[1][0].get_lines()[0].get_ydata(),
        [0.87268333, 1.10409369, 1.10409369, 1.10409369, 0.69098161])
    assert np.allclose(
        ax[2][0].get_lines()[0].get_ydata(),
        [-14.46166855, -14.46166855, 0.32305686, 0.32305686, 0.32305686])
Example #5
0
def test_can_track_acceptance_rate_when_iterating(net: BayesNet) -> None:
    acceptance_rate_tracker = AcceptanceRateTracker()
    latents = list(net.get_latent_vertices())

    algo = MetropolisHastingsSampler(proposal_distribution='prior', proposal_listeners=[acceptance_rate_tracker])
    samples = generate_samples(net=net, sample_from=latents, sampling_algorithm=algo, drop=3)

    draws = 100
    for _ in islice(samples, draws):
        for latent in latents:
            rate = acceptance_rate_tracker.get_acceptance_rate(latent)
            assert 0 <= rate <= 1
Example #6
0
def test_generate_samples_throws_if_vertices_in_sample_from_are_missing_labels(
) -> None:
    sigma = Gamma(1., 1)
    vertex = Gaussian(0., sigma, label="gaussian")

    assert sigma.get_label() is None

    net = BayesNet([sigma, vertex])
    with pytest.raises(ValueError,
                       match=r"Vertices in sample_from must be labelled."):
        samples = generate_samples(net=net,
                                   sample_from=net.iter_latent_vertices())
Example #7
0
def test_iter_with_live_plot(net: BayesNet) -> None:
    KeanuRandom.set_default_random_seed(1)
    _, ax = plt.subplots(3, 1, squeeze=False)
    samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), live_plot=True, refresh_every=5, ax=ax)

    for sample in islice(samples, 5):
        pass

    reorder_subplots(ax)

    assert len(ax) == 3
    assert all(len(ax[i][0].get_lines()) == 1 for i in range(3))
    assert all(len(ax[i][0].get_lines()[0].get_ydata() == 5) for i in range(3))
Example #8
0
def test_can_iter_through_samples(algo: Callable[[BayesNet],
                                                 PosteriorSamplingAlgorithm],
                                  net: BayesNet) -> None:
    draws = 10
    samples = generate_samples(net=net,
                               sample_from=net.iter_latent_vertices(),
                               sampling_algorithm=algo(net),
                               down_sample_interval=1)
    count = 0
    for sample in islice(samples, draws):
        count += 1

    assert count == draws
Example #9
0
def test_iter_returns_same_result_as_sample(algo: str) -> None:
    draws = 100
    model = thermometers.model()
    net = BayesNet(model.temperature.get_connected_graph())
    set_starting_state(model)
    samples = sample(net=net, sample_from=net.get_latent_vertices(), algo=algo, draws=draws)
    set_starting_state(model)
    iter_samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo=algo)

    samples_dataframe = pd.DataFrame()
    [samples_dataframe.append(pd.DataFrame(list(next_sample.items()))) for next_sample in islice(iter_samples, draws)]

    for vertex_id in samples_dataframe:
        np.testing.assert_almost_equal(samples_dataframe[vertex_id].mean(), np.average(samples[vertex_id]))
Example #10
0
def test_can_iter_through_tensor_samples(algo: Callable[
    [BayesNet], PosteriorSamplingAlgorithm], tensor_net: BayesNet) -> None:
    draws = 10
    samples = generate_samples(net=tensor_net,
                               sample_from=tensor_net.iter_latent_vertices(),
                               sampling_algorithm=algo(tensor_net),
                               down_sample_interval=1)
    count = 0
    for sample in islice(samples, draws):
        count += 1
        for distribution in ('exp', 'gamma'):
            for i in (0, 1):
                for j in (0, 1):
                    assert ((distribution, (i, j)) in sample)
    assert count == draws
Example #11
0
def test_iter_with_live_plot(net: BayesNet) -> None:
    num_plots = 3
    _, ax = plt.subplots(num_plots, 1, squeeze=False)
    samples = generate_samples(net=net,
                               sample_from=net.iter_latent_vertices(),
                               live_plot=True,
                               refresh_every=5,
                               ax=ax)

    for sample in islice(samples, 5):
        pass

    reorder_subplots(ax)
    assert len(ax) == num_plots
    assert all(len(ax[i][0].get_lines()) == 1 for i in range(num_plots))
    assert all(
        len(ax[i][0].get_lines()[0].get_ydata() == 5)
        for i in range(num_plots))
Example #12
0
def test_autocorrelation_same_for_streaming_as_batch() -> None:
    with Model() as model:
        model.uniform = Uniform(0, 1000)
    net = model.to_bayes_net()
    draws = 15
    set_starting_state(model)
    samples = sample(net=net, sample_from=net.get_latent_vertices(), algo="metropolis", draws=draws)
    set_starting_state(model)
    iter_samples = generate_samples(net=net, sample_from=net.get_latent_vertices(), algo="metropolis")

    samples_dataframe = pd.DataFrame()
    for next_sample in islice(iter_samples, draws):
        samples_dataframe = samples_dataframe.append(next_sample, ignore_index=True)

    for vertex_id in samples_dataframe:
        autocorr_streaming = stats.autocorrelation(list(samples_dataframe[vertex_id].values))
        autocorr_batch = stats.autocorrelation(samples[vertex_id])
        np.testing.assert_array_equal(autocorr_batch, autocorr_streaming)
Example #13
0
def test_can_specify_a_gaussian_proposal_distribution(net: BayesNet) -> None:
    generate_samples(net=net,
                     sample_from=net.get_latent_vertices(),
                     proposal_distribution="gaussian",
                     proposal_distribution_sigma=np.array(1.))