def test_no_conditioning(self, joint_distribution): model = joint_distribution([ tfd.Normal(1., 1.), tfd.Normal(3., 2.), lambda b, a: tfd.Normal(a + b, 5.) ]) approx = rethinking.quap(model) self.assertAllCloseNested(approx.mean(), [1., 3., 4.]) self.assertAllCloseNested(approx.stddev(), [1., 2., 30**0.5])
def test_no_conditioning(self, joint_distribution): model = joint_distribution({ 'a': tfd.Normal(1., 1.), 'b': tfd.Normal(3., 2.), 'c': lambda a, b: tfd.Normal(a + b, 5.) }) approx = rethinking.quap(model) self.assertAllCloseNested(approx.mean(), dict(a=1., b=3., c=4.)) self.assertAllCloseNested(approx.stddev(), dict(a=1., b=2., c=30**0.5))
def test_no_conditioning(self, joint_distribution): ModelSpec = collections.namedtuple('ModelSpec', 'a,b,c') model = joint_distribution( ModelSpec(a=tfd.Normal(1., 1.), b=tfd.Normal(3., 2.), c=lambda a, b: tfd.Normal(a + b, 5.))) approx = rethinking.quap(model) self.assertAllCloseNested(approx.mean(), ModelSpec(a=1., b=3., c=4.)) self.assertAllCloseNested(approx.stddev(), ModelSpec(a=1., b=2., c=30**0.5))
def test_conditioning(self, joint_distribution): model = joint_distribution( [tfd.Normal(1., 2.), lambda a: tfd.Normal(2 * a + 1., 5.)]) approx = rethinking.quap(model, data=[None, 2.], initial_position=[1.5]) dists, _ = approx.sample_distributions() # See, e.g., Bishop, equation 2.116 self.assertAllClose(dists[0].mean(), 33. / 41.) self.assertAllClose(dists[0].stddev(), (100. / 41.)**0.5)
def test_conditioning(self, joint_distribution): model = joint_distribution({ 'a': tfd.Normal(1., 2.), 'b': lambda a: tfd.Normal(2 * a + 1., 5.)}) approx = rethinking.quap(model, data={'b': 2.}, initial_position={'a': 1.5}) dists, _ = approx.sample_distributions() # See, e.g., Bishop, equation 2.116 self.assertAllClose(dists['a'].mean(), 33. / 41.) self.assertAllClose(dists['a'].stddev(), (100. / 41.) ** 0.5)
def test_conditioning(self, joint_distribution): ModelSpec = collections.namedtuple('ModelSpec', 'a,b') model = joint_distribution(ModelSpec( a=tfd.Normal(1., 2.), b=lambda a: tfd.Normal(2 * a + 1., 5.))) approx = rethinking.quap(model, data=ModelSpec(a=None, b=2.), initial_position=ModelSpec(a=1.5, b=None)) dists, _ = approx.sample_distributions() # See, e.g., Bishop, equation 2.116 self.assertAllClose(dists.a.mean(), 33. / 41.) self.assertAllClose(dists.a.stddev(), (100. / 41.) ** 0.5)