Beispiel #1
0
    def testGammaGammaKL(self):
        alpha0 = np.array([3.])
        beta0 = np.array([1., 2., 3., 1.5, 2.5, 3.5])

        alpha1 = np.array([0.4])
        beta1 = np.array([0.5, 1., 1.5, 2., 2.5, 3.])

        # Build graph.
        with self.test_session() as sess:
            g0 = gamma_lib.Gamma(alpha=alpha0, beta=beta0)
            g1 = gamma_lib.Gamma(alpha=alpha1, beta=beta1)
            x = g0.sample(int(1e4), seed=0)
            kl_sample = math_ops.reduce_mean(
                g0.log_prob(x) - g1.log_prob(x), 0)
            kl_actual = kullback_leibler.kl(g0, g1)

        # Execute graph.
        [kl_sample_, kl_actual_] = sess.run([kl_sample, kl_actual])

        kl_expected = ((alpha0 - alpha1) * special.digamma(alpha0) +
                       special.gammaln(alpha1) - special.gammaln(alpha0) +
                       alpha1 * np.log(beta0) - alpha1 * np.log(beta1) +
                       alpha0 * (beta1 / beta0 - 1.))

        self.assertEqual(beta0.shape, kl_actual.get_shape())
        self.assertAllClose(kl_expected, kl_actual_, atol=0., rtol=1e-6)
        self.assertAllClose(kl_sample_, kl_actual_, atol=0., rtol=1e-2)
Beispiel #2
0
 def testGammaNonPositiveInitializationParamsRaises(self):
   with self.test_session():
     alpha_v = constant_op.constant(0.0, name="alpha")
     beta_v = constant_op.constant(1.0, name="beta")
     gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v, validate_args=True)
     with self.assertRaisesOpError("alpha"):
       gamma.mean().eval()
     alpha_v = constant_op.constant(1.0, name="alpha")
     beta_v = constant_op.constant(0.0, name="beta")
     gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v, validate_args=True)
     with self.assertRaisesOpError("beta"):
       gamma.mean().eval()
Beispiel #3
0
 def testGammaPdfOfSampleMultiDims(self):
     with session.Session() as sess:
         gamma = gamma_lib.Gamma(alpha=[7., 11.], beta=[[5.], [6.]])
         num = 50000
         samples = gamma.sample(num, seed=137)
         pdfs = gamma.pdf(samples)
         sample_vals, pdf_vals = sess.run([samples, pdfs])
         self.assertEqual(samples.get_shape(), (num, 2, 2))
         self.assertEqual(pdfs.get_shape(), (num, 2, 2))
         self.assertAllClose(stats.gamma.mean(
             [[7., 11.], [7., 11.]],
             scale=1 / np.array([[5., 5.], [6., 6.]])),
                             sample_vals.mean(axis=0),
                             atol=.1)
         self.assertAllClose(stats.gamma.var(
             [[7., 11.], [7., 11.]],
             scale=1 / np.array([[5., 5.], [6., 6.]])),
                             sample_vals.var(axis=0),
                             atol=.1)
         self._assertIntegral(sample_vals[:, 0, 0],
                              pdf_vals[:, 0, 0],
                              err=0.02)
         self._assertIntegral(sample_vals[:, 0, 1],
                              pdf_vals[:, 0, 1],
                              err=0.02)
         self._assertIntegral(sample_vals[:, 1, 0],
                              pdf_vals[:, 1, 0],
                              err=0.02)
         self._assertIntegral(sample_vals[:, 1, 1],
                              pdf_vals[:, 1, 1],
                              err=0.02)
Beispiel #4
0
 def testGammaSampleMultiDimensional(self):
     with session.Session():
         alpha_v = np.array([np.arange(1, 101,
                                       dtype=np.float32)])  # 1 x 100
         beta_v = np.array([np.arange(1, 11, dtype=np.float32)]).T  # 10 x 1
         gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v)
         n = 10000
         samples = gamma.sample(n, seed=137)
         sample_values = samples.eval()
         self.assertEqual(samples.get_shape(), (n, 10, 100))
         self.assertEqual(sample_values.shape, (n, 10, 100))
         zeros = np.zeros_like(alpha_v + beta_v)  # 10 x 100
         alpha_bc = alpha_v + zeros
         beta_bc = beta_v + zeros
         self.assertAllClose(sample_values.mean(axis=0),
                             stats.gamma.mean(alpha_bc, scale=1 / beta_bc),
                             rtol=.035)
         self.assertAllClose(sample_values.var(axis=0),
                             stats.gamma.var(alpha_bc, scale=1 / beta_bc),
                             atol=4.5)
         fails = 0
         trials = 0
         for ai, a in enumerate(np.reshape(alpha_v, [-1])):
             for bi, b in enumerate(np.reshape(beta_v, [-1])):
                 s = sample_values[:, bi, ai]
                 trials += 1
                 fails += 0 if self._kstest(a, b, s) else 1
         self.assertLess(fails, trials * 0.03)
Beispiel #5
0
 def testDocstringExample(self):
   with self.test_session():
     exp_gamma_distribution = (
         transformed_distribution_lib.TransformedDistribution(
             distribution=gamma_lib.Gamma(concentration=1., rate=2.),
             bijector=bijectors.Invert(bijectors.Exp())))
     self.assertAllEqual(
         [], array_ops.shape(exp_gamma_distribution.sample()).eval())
Beispiel #6
0
 def testGammaEntropy(self):
     with self.test_session():
         alpha_v = np.array([1.0, 3.0, 2.5])
         beta_v = np.array([1.0, 4.0, 5.0])
         expected_entropy = stats.gamma.entropy(alpha_v, scale=1 / beta_v)
         gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v)
         self.assertEqual(gamma.entropy().get_shape(), (3, ))
         self.assertAllClose(gamma.entropy().eval(), expected_entropy)
Beispiel #7
0
 def testGammaStd(self):
     with self.test_session():
         alpha_v = np.array([1.0, 3.0, 2.5])
         beta_v = np.array([1.0, 4.0, 5.0])
         gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v)
         expected_stddev = stats.gamma.std(alpha_v, scale=1. / beta_v)
         self.assertEqual(gamma.stddev().get_shape(), (3, ))
         self.assertAllClose(gamma.stddev().eval(), expected_stddev)
 def testGammaVariance(self):
   with self.test_session():
     alpha_v = np.array([1.0, 3.0, 2.5])
     beta_v = np.array([1.0, 4.0, 5.0])
     gamma = gamma_lib.Gamma(concentration=alpha_v, rate=beta_v)
     expected_variances = stats.gamma.var(alpha_v, scale=1 / beta_v)
     self.assertEqual(gamma.variance().get_shape(), (3,))
     self.assertAllClose(gamma.variance().eval(), expected_variances)
 def testGammaModeAllowNanStatsIsFalseWorksWhenAllBatchMembersAreDefined(self):
   with self.test_session():
     alpha_v = np.array([5.5, 3.0, 2.5])
     beta_v = np.array([1.0, 4.0, 5.0])
     gamma = gamma_lib.Gamma(concentration=alpha_v, rate=beta_v)
     expected_modes = (alpha_v - 1) / beta_v
     self.assertEqual(gamma.mode().get_shape(), (3,))
     self.assertAllClose(gamma.mode().eval(), expected_modes)
Beispiel #10
0
 def testGammaModeAllowNanStatsFalseRaisesForUndefinedBatchMembers(self):
   with self.test_session():
     # Mode will not be defined for the first entry.
     alpha_v = np.array([0.5, 3.0, 2.5])
     beta_v = np.array([1.0, 4.0, 5.0])
     gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v, allow_nan_stats=False)
     with self.assertRaisesOpError("x < y"):
       gamma.mode().eval()
Beispiel #11
0
  def testGammaShape(self):
    with self.test_session():
      alpha = constant_op.constant([3.0] * 5)
      beta = constant_op.constant(11.0)
      gamma = gamma_lib.Gamma(concentration=alpha, rate=beta)

      self.assertEqual(gamma.batch_shape_tensor().eval(), (5,))
      self.assertEqual(gamma.batch_shape, tensor_shape.TensorShape([5]))
      self.assertAllEqual(gamma.event_shape_tensor().eval(), [])
      self.assertEqual(gamma.event_shape, tensor_shape.TensorShape([]))
Beispiel #12
0
 def testGammaModeAllowNanStatsIsTrueReturnsNaNforUndefinedBatchMembers(self):
   with self.test_session():
     # Mode will not be defined for the first entry.
     alpha_v = np.array([0.5, 3.0, 2.5])
     beta_v = np.array([1.0, 4.0, 5.0])
     gamma = gamma_lib.Gamma(alpha=alpha_v, beta=beta_v, allow_nan_stats=True)
     expected_modes = (alpha_v - 1) / beta_v
     expected_modes[0] = np.nan
     self.assertEqual(gamma.mode().get_shape(), (3,))
     self.assertAllClose(gamma.mode().eval(), expected_modes)
Beispiel #13
0
    def testGammaCDF(self):
        with self.test_session():
            batch_size = 6
            alpha = constant_op.constant([2.0] * batch_size)
            beta = constant_op.constant([3.0] * batch_size)
            alpha_v = 2.0
            beta_v = 3.0
            x = np.array([2.5, 2.5, 4.0, 0.1, 1.0, 2.0], dtype=np.float32)

            gamma = gamma_lib.Gamma(alpha=alpha, beta=beta)
            expected_cdf = stats.gamma.cdf(x, alpha_v, scale=1 / beta_v)

            cdf = gamma.cdf(x)
            self.assertEqual(cdf.get_shape(), (6, ))
            self.assertAllClose(cdf.eval(), expected_cdf)
Beispiel #14
0
  def testGammaLogPDF(self):
    with self.test_session():
      batch_size = 6
      alpha = constant_op.constant([2.0] * batch_size)
      beta = constant_op.constant([3.0] * batch_size)
      alpha_v = 2.0
      beta_v = 3.0
      x = np.array([2.5, 2.5, 4.0, 0.1, 1.0, 2.0], dtype=np.float32)
      gamma = gamma_lib.Gamma(concentration=alpha, rate=beta)
      expected_log_pdf = stats.gamma.logpdf(x, alpha_v, scale=1 / beta_v)
      log_pdf = gamma.log_prob(x)
      self.assertEqual(log_pdf.get_shape(), (6,))
      self.assertAllClose(log_pdf.eval(), expected_log_pdf)

      pdf = gamma.prob(x)
      self.assertEqual(pdf.get_shape(), (6,))
      self.assertAllClose(pdf.eval(), np.exp(expected_log_pdf))
Beispiel #15
0
    def testGammaLogPDFMultidimensionalBroadcasting(self):
        with self.test_session():
            batch_size = 6
            alpha = constant_op.constant([[2.0, 4.0]] * batch_size)
            beta = constant_op.constant(3.0)
            alpha_v = np.array([2.0, 4.0])
            beta_v = 3.0
            x = np.array([[2.5, 2.5, 4.0, 0.1, 1.0, 2.0]], dtype=np.float32).T
            gamma = gamma_lib.Gamma(alpha=alpha, beta=beta)
            expected_log_pdf = stats.gamma.logpdf(x, alpha_v, scale=1 / beta_v)
            log_pdf = gamma.log_pdf(x)
            log_pdf_values = log_pdf.eval()
            self.assertEqual(log_pdf.get_shape(), (6, 2))
            self.assertAllClose(log_pdf_values, expected_log_pdf)

            pdf = gamma.pdf(x)
            pdf_values = pdf.eval()
            self.assertEqual(pdf.get_shape(), (6, 2))
            self.assertAllClose(pdf_values, np.exp(expected_log_pdf))
Beispiel #16
0
 def testGammaSample(self):
     with session.Session():
         alpha_v = 4.0
         beta_v = 3.0
         alpha = constant_op.constant(alpha_v)
         beta = constant_op.constant(beta_v)
         n = 100000
         gamma = gamma_lib.Gamma(alpha=alpha, beta=beta)
         samples = gamma.sample(n, seed=137)
         sample_values = samples.eval()
         self.assertEqual(samples.get_shape(), (n, ))
         self.assertEqual(sample_values.shape, (n, ))
         self.assertAllClose(sample_values.mean(),
                             stats.gamma.mean(alpha_v, scale=1 / beta_v),
                             atol=.01)
         self.assertAllClose(sample_values.var(),
                             stats.gamma.var(alpha_v, scale=1 / beta_v),
                             atol=.15)
         self.assertTrue(self._kstest(alpha_v, beta_v, sample_values))