Пример #1
0
    def test_log_normal_prior_sampling(self):
        mu = -1.234
        sig = 0.456
        p1 = pints.LogNormalLogPrior(mu, sig)
        self.assertEqual(len(p1.sample()), 1)

        n = 1000
        samples1 = p1.sample(n)
        self.assertEqual(len(samples1), n)

        # Mean should be exp(mu + 0.5*sig^2), so we check that this is very
        # roughly the case, to ensure the parameterisation is correct
        sample_mean = np.mean(samples1).item()
        analyt_mean = np.exp(mu + 0.5 * sig * sig)
        self.assertTrue(0.9 * analyt_mean < sample_mean < 1.1 * analyt_mean)
Пример #2
0
 def test_log_normal_prior_cdf_icdf(self):
     p1 = pints.LogNormalLogPrior(-3.5, 7.7)
     self.assertAlmostEqual(p1.cdf(1.1), 0.6797226585187124)
     self.assertAlmostEqual(p1.icdf(0.4), 0.004292986243507321)
Пример #3
0
    def test_log_normal_prior(self):

        # Test input parameters
        self.assertRaises(ValueError, pints.LogNormalLogPrior, 0, 0)
        self.assertRaises(ValueError, pints.LogNormalLogPrior, 2, -2)

        mu1 = 0.123
        mu2 = -4.567

        sd1 = 2.345
        sd2 = 0.356

        p1 = pints.LogNormalLogPrior(mu1, sd1)
        p2 = pints.LogNormalLogPrior(mu2, sd2)

        points = [-2., 0.001, 0.1, 1.0, 2.45, 6.789]

        # Test means
        self.assertAlmostEqual(p1.mean(), 17.68138692293243)
        self.assertAlmostEqual(p2.mean(), 0.01106872184593001)

        # Test n_parameters
        self.assertEqual(p1.n_parameters(), 1)

        # Test specific points
        for point in points:
            pints_val_1 = p1([point])
            scipy_val_1 = scipy.stats.lognorm.logpdf(point, scale=np.exp(mu1),
                                                     s=sd1)

            pints_val_2 = p2([point])
            scipy_val_2 = scipy.stats.lognorm.logpdf(point, scale=np.exp(mu2),
                                                     s=sd2)

            self.assertAlmostEqual(pints_val_1, scipy_val_1)
            self.assertAlmostEqual(pints_val_2, scipy_val_2)

        # Test derivatives
        p1_derivs = [0., 278.54579293277163, -5.589063346695011,
                     -0.977632398470638, -0.4655454616904081,
                     -0.19530581390245802]

        p2_derivs = [0., 17469.53729786411, -188.67179862122487,
                     -37.03553844211642, -18.00246833062188,
                     -7.681261547066602]

        for point, hand_calc_deriv in zip(points, p1_derivs):
            pints_val, pints_deriv = p1.evaluateS1([point])
            scipy_val = scipy.stats.lognorm.logpdf(point, scale=np.exp(mu1),
                                                   s=sd1)

            self.assertAlmostEqual(pints_val, scipy_val)
            self.assertAlmostEqual(pints_deriv[0], hand_calc_deriv)

        for point, hand_calc_deriv in zip(points, p2_derivs):
            pints_val, pints_deriv = p2.evaluateS1([point])
            scipy_val = scipy.stats.lognorm.logpdf(point, scale=np.exp(mu2),
                                                   s=sd2)

            self.assertAlmostEqual(pints_val, scipy_val)
            self.assertAlmostEqual(pints_deriv[0], hand_calc_deriv)