def testRunningVarianceMaxPoints(self): window_size = 100 rng = np.random.RandomState(_test_seed()) data = tf.convert_to_tensor( np.concatenate( [rng.randn(window_size), 1. + 2. * rng.randn(window_size * 10)], axis=0)) def kernel(rvs, idx): rvs, _ = fun_mcmc.running_variance_step( rvs, data[idx], window_size=window_size) return (rvs, idx + 1), (rvs.mean, rvs.variance) _, (mean, var) = fun_mcmc.trace( state=(fun_mcmc.running_variance_init([], data.dtype), 0), fn=kernel, num_steps=len(data), ) # Up to window_size, we compute the running mean/variance exactly. self.assertAllClose(np.mean(data[:window_size]), mean[window_size - 1]) self.assertAllClose(np.var(data[:window_size]), var[window_size - 1]) # After window_size, we're doing exponential moving average, and pick up the # mean/variance after the change in the distribution. Since the moving # average is computed only over ~window_size points, this test is rather # noisy. self.assertAllClose(1., mean[-1], atol=0.2) self.assertAllClose(4., var[-1], atol=0.8)
def testRunningVariance(self, shape, aggregation): rng = np.random.RandomState(_test_seed()) data = tf.convert_to_tensor(rng.randn(*shape)) true_aggregation = (0,) + (() if aggregation is None else tuple( [a + 1 for a in util.flatten_tree(aggregation)])) true_mean = np.mean(data, true_aggregation) true_var = np.var(data, true_aggregation) def kernel(rvs, idx): rvs, _ = fun_mcmc.running_variance_step(rvs, data[idx], axis=aggregation) return (rvs, idx + 1), () (rvs, _), _ = fun_mcmc.trace( state=(fun_mcmc.running_variance_init(true_mean.shape, data[0].dtype), 0), fn=kernel, num_steps=len(data), trace_fn=lambda *args: ()) self.assertAllClose(true_mean, rvs.mean) self.assertAllClose(true_var, rvs.variance)