Skip to content
Snippets Groups Projects
Commit 9c0bbfbc authored by Moritz Huebner's avatar Moritz Huebner
Browse files

Merge branch 'add-posterior-probability-calculation' into 'master'

Adds two new methods to the result object: kde and posterior_probability

See merge request !278
parents 87971e0c 216b72f4
No related branches found
No related tags found
1 merge request!278Adds two new methods to the result object: kde and posterior_probability
Pipeline #39102 passed
......@@ -8,6 +8,7 @@ import numpy as np
import deepdish
import pandas as pd
import corner
import scipy.stats
import matplotlib
import matplotlib.pyplot as plt
......@@ -928,6 +929,44 @@ class Result(object):
return np.all(A == B)
return False
@property
def kde(self):
""" Kernel density estimate built from the stored posterior
Uses `scipy.stats.gaussian_kde` to generate the kernel density
"""
try:
return self._kde
except AttributeError:
self._kde = scipy.stats.gaussian_kde(
self.posterior[self.search_parameter_keys].values.T)
return self._kde
def posterior_probability(self, sample):
""" Calculate the posterior probabily for a new sample
This queries a Kernel Density Estimate of the posterior to calculate
the posterior probability density for the new sample.
Parameters
----------
sample: dict, or list of dictionaries
A dictionary containing all the keys from
self.search_parameter_keys and corresponding values at which to
calculate the posterior probability
Returns
-------
p: array-like,
The posterior probability of the sample
"""
if isinstance(sample, dict):
sample = [sample]
ordered_sample = [[s[key] for key in self.search_parameter_keys]
for s in sample]
return self.kde(ordered_sample)
def plot_multiple(results, filename=None, labels=None, colours=None,
save=True, evidences=False, **kwargs):
......
......@@ -240,6 +240,30 @@ class TestResult(unittest.TestCase):
with self.assertRaises(TypeError):
self.result.get_all_injection_credible_levels()
def test_kde(self):
kde = self.result.kde
import scipy.stats
self.assertEqual(type(kde), scipy.stats.kde.gaussian_kde)
self.assertEqual(kde.d, 2)
def test_posterior_probability(self):
sample = dict(x=0, y=0.1)
self.assertTrue(
isinstance(self.result.posterior_probability(sample), np.ndarray))
self.assertTrue(
len(self.result.posterior_probability(sample)), 1)
self.assertEqual(
self.result.posterior_probability(sample)[0],
self.result.kde([0, 0.1]))
def test_multiple_posterior_probability(self):
sample = [dict(x=0, y=0.1), dict(x=0.8, y=0)]
self.assertTrue(
isinstance(self.result.posterior_probability(sample), np.ndarray))
self.assertTrue(
all(self.result.posterior_probability(sample)
== self.result.kde([[0, 0.1], [0.8, 0]])))
if __name__ == '__main__':
unittest.main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment