Exemple #1
0
  def testSampleGammaHighConcentration(self):
    concentration = np.linspace(10., 20., 10)
    rate = np.float64(1.)
    num_samples = int(1e5)
    self.assertLess(
        self.evaluate(
            st.min_num_samples_for_dkwm_cdf_test(
                discrepancy=0.04, false_fail_rate=1e-9, false_pass_rate=1e-9)),
        num_samples)

    samples = gamma_lib._random_gamma_noncpu(
        shape=[num_samples, 10],
        concentration=concentration,
        rate=rate,
        seed=test_util.test_seed())

    gamma = tfd.Gamma(
        concentration=concentration, rate=rate, validate_args=True)
    self.evaluate(
        st.assert_true_cdf_equal_by_dkwm(
            samples,
            gamma.cdf,
            st.left_continuous_cdf_discrete_distribution(gamma),
            false_fail_rate=1e-9))

    self.assertAllClose(
        self.evaluate(tf.math.reduce_mean(samples, axis=0)),
        sp_stats.gamma.mean(concentration, scale=1 / rate),
        rtol=0.01)
    self.assertAllClose(
        self.evaluate(tf.math.reduce_variance(samples, axis=0)),
        sp_stats.gamma.mean(concentration, scale=1 / rate),
        rtol=0.05)
Exemple #2
0
    def testSamplePoissonHighRates(self):
        # High rate (>= log(10.)) samples would use rejection sampling.
        rate = [10., 10.5, 11., 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5]
        log_rate = np.log(rate)
        num_samples = int(1e5)
        self.assertLess(
            self.evaluate(
                st.min_num_samples_for_dkwm_cdf_test(discrepancy=0.04,
                                                     false_fail_rate=1e-9,
                                                     false_pass_rate=1e-9)),
            num_samples)

        samples = poisson_lib._random_poisson_noncpu(
            shape=[num_samples],
            log_rates=log_rate,
            output_dtype=tf.float64,
            seed=test_util.test_seed())

        poisson = tfd.Poisson(log_rate=log_rate, validate_args=True)
        self.evaluate(
            st.assert_true_cdf_equal_by_dkwm(
                samples,
                poisson.cdf,
                st.left_continuous_cdf_discrete_distribution(poisson),
                false_fail_rate=1e-9))

        self.assertAllClose(self.evaluate(tf.math.reduce_mean(samples,
                                                              axis=0)),
                            stats.poisson.mean(rate),
                            rtol=0.01)
        self.assertAllClose(self.evaluate(
            tf.math.reduce_variance(samples, axis=0)),
                            stats.poisson.var(rate),
                            rtol=0.05)
Exemple #3
0
 def propSampleCorrectMarginals(self,
                                dist,
                                special_class,
                                under_hypothesis=False):
     # Property: When projected on one class, multinomial should sample the
     # binomial distribution.
     seed = test_util.test_seed()
     num_samples = 120000
     needed = self.evaluate(
         st.min_num_samples_for_dkwm_cdf_test(0.02,
                                              false_fail_rate=1e-9,
                                              false_pass_rate=1e-9))
     self.assertGreater(num_samples, needed)
     samples = dist.sample(num_samples, seed=seed)
     successes = samples[..., special_class]
     prob_success = dist._probs_parameter_no_checks()[..., special_class]
     if under_hypothesis:
         hp.note('Expected probability of success {}'.format(prob_success))
         hp.note('Successes obtained {}'.format(successes))
     expected_dist = tfd.Binomial(dist.total_count, probs=prob_success)
     self.evaluate(
         st.assert_true_cdf_equal_by_dkwm(
             successes,
             expected_dist.cdf,
             st.left_continuous_cdf_discrete_distribution(expected_dist),
             false_fail_rate=1e-9))
Exemple #4
0
 def testXLAFriendlySampler(self):
   if tf.executing_eagerly():
     msg = 'XLA requires tf.function, mode switching is meaningless.'
     self.skipTest(msg)
   dist = tfd.BetaBinomial(
       total_count=50, concentration0=1e-7, concentration1=1e-5)
   seed = test_util.test_seed(sampler_type='stateless')
   num_samples = 20000
   sample = self.evaluate(
       tf.function(jit_compile=True)(dist.sample)(
           num_samples, seed=seed))
   self.assertAllEqual(np.zeros_like(sample), np.isnan(sample))
   # Beta(1e-7, 1e-5) should basically always be either 1 or 0, and 1 should
   # occur with probability 100/101.
   # Ergo, the beta binomial samples should basically always be either 50 or 0,
   # and 50 should occur with probability 100/101.
   high_samples_mask = sample == 50
   low_samples_mask = sample == 0
   self.assertAllEqual(np.ones_like(sample),
                       high_samples_mask | low_samples_mask)
   expect = tfd.Bernoulli(probs=100.0/101.0)
   self.evaluate(st.assert_true_cdf_equal_by_dkwm(
       samples=tf.cast(high_samples_mask, tf.float32),
       cdf=expect.cdf,
       left_continuous_cdf=st.left_continuous_cdf_discrete_distribution(
           expect),
       false_fail_rate=1e-9))
   self.assertGreater(
       num_samples,
       self.evaluate(st.min_num_samples_for_dkwm_cdf_test(
           0.05, false_fail_rate=1e-9, false_pass_rate=1e-9)))
    def testSamplePoissonLowAndHighRates(self):
        rate = [1., 3., 5., 6., 7., 10., 13.0, 14., 15., 18.]
        log_rate = np.log(rate)
        num_samples = int(1e5)
        self.assertLess(
            self.evaluate(
                st.min_num_samples_for_dkwm_cdf_test(discrepancy=0.04,
                                                     false_fail_rate=1e-9,
                                                     false_pass_rate=1e-9)),
            num_samples)

        samples = self.evaluate(
            poisson_dist.random_poisson_rejection_sampler(
                [num_samples, 10], log_rate, seed=test_util.test_seed()))

        poisson = tfd.Poisson(log_rate=log_rate, validate_args=True)
        self.evaluate(
            st.assert_true_cdf_equal_by_dkwm(
                samples,
                poisson.cdf,
                st.left_continuous_cdf_discrete_distribution(poisson),
                false_fail_rate=1e-9))

        self.assertAllClose(self.evaluate(tf.math.reduce_mean(samples,
                                                              axis=0)),
                            stats.poisson.mean(rate),
                            rtol=0.01)
        self.assertAllClose(self.evaluate(
            tf.math.reduce_variance(samples, axis=0)),
                            stats.poisson.var(rate),
                            rtol=0.05)
    def testSamplePoissonLowRates(self):
        # Low log rate (< log(10.)) samples would use Knuth's algorithm.
        rate = [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5]
        log_rate = np.log(rate)
        num_samples = int(1e5)
        self.assertLess(
            self.evaluate(
                st.min_num_samples_for_dkwm_cdf_test(discrepancy=0.04,
                                                     false_fail_rate=1e-9,
                                                     false_pass_rate=1e-9)),
            num_samples)

        samples = self.evaluate(
            poisson_dist.random_poisson_rejection_sampler(
                [num_samples, 10], log_rate, seed=test_util.test_seed()))

        poisson = tfd.Poisson(log_rate=log_rate, validate_args=True)
        self.evaluate(
            st.assert_true_cdf_equal_by_dkwm(
                samples,
                poisson.cdf,
                st.left_continuous_cdf_discrete_distribution(poisson),
                false_fail_rate=1e-9))

        self.assertAllClose(self.evaluate(tf.math.reduce_mean(samples,
                                                              axis=0)),
                            stats.poisson.mean(rate),
                            rtol=0.01)
        self.assertAllClose(self.evaluate(
            tf.math.reduce_variance(samples, axis=0)),
                            stats.poisson.var(rate),
                            rtol=0.05)
Exemple #7
0
  def testSamplePoissonLowAndHighRates(self):
    rate = [1., 3., 5., 6., 7., 10., 13.0, 14., 15., 18.]
    log_rate = np.log(rate)
    num_samples = int(1e5)
    poisson = tfd.Poisson(log_rate=log_rate, validate_args=True)
    self.assertLess(
        self.evaluate(
            st.min_num_samples_for_dkwm_cdf_test(
                discrepancy=0.04, false_fail_rate=1e-9, false_pass_rate=1e-9)),
        num_samples)

    samples = poisson_lib._random_poisson_noncpu(
        shape=[num_samples],
        log_rates=log_rate,
        output_dtype=tf.float64,
        seed=test_util.test_seed())

    self.evaluate(
        st.assert_true_cdf_equal_by_dkwm(
            samples,
            poisson.cdf,
            st.left_continuous_cdf_discrete_distribution(poisson),
            false_fail_rate=1e-9))