def test_adapt_does_nothing(self): dimension = 3 ps = rand(dimension) distribution = Bernoulli(ps) kernel = HypercubeKernel(1.) Z = zeros((2, distribution.dimension)) threshold = 0.5 spread = .5 sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) # serialise, call adapt, load, compare f = NamedTemporaryFile() dump(sampler, f) f.seek(0) sampler_copy = load(f) f.close() sampler.adapt(None, None) # rough check for equality, dont do a proper one here self.assertEqual(type(sampler_copy.kernel), type(sampler.kernel)) self.assertEqual(sampler_copy.kernel.gamma, sampler.kernel.gamma) self.assertEqual(type(sampler_copy.distribution), type(sampler.distribution)) self.assertEqual(sampler_copy.distribution.dimension, sampler.distribution.dimension) self.assertEqual(type(sampler_copy.Z), type(sampler.Z)) self.assertEqual(sampler_copy.Z.shape, sampler.Z.shape) self.assertAlmostEqual(norm(sampler_copy.Z - sampler.Z), 0) self.assertEqual(sampler_copy.spread, sampler.spread) # this is none, so just compare self.assertEqual(sampler.Q, sampler_copy.Q)
def main(): d = 5 ps = rand(d) ps /= norm(ps) distribution = Bernoulli(ps) num_history = 100 Z = distribution.sample(num_history).samples threshold = 0.8 spread = 0.2 gamma = 0.2 kernel = HypercubeKernel(gamma) mcmc_sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) start = zeros(distribution.dimension, dtype=numpy.bool8) mcmc_params = MCMCParams(start=start, num_iterations=1000) chain = MCMCChain(mcmc_sampler, mcmc_params) chain.append_mcmc_output(StatisticsOutput(plot_times=True)) chain.append_mcmc_output(DiscretePlottingOutput(plot_from=0, lag=100)) chain.run() print "ps", ps print "empirical", mean(chain.samples, 0)
def test_chain_bernoulli(self): # runs the sampler on a distribution of infdependent bernoulli variables # and compares the mean d = 5 ps = rand(d) ps /= norm(ps) distribution = Bernoulli(ps) num_history = 100 Z = distribution.sample(num_history).samples threshold = 0.8 spread = 0.2 gamma = 0.2 kernel = HypercubeKernel(gamma) mcmc_sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) start = zeros(distribution.dimension, dtype=numpy.bool8) mcmc_params = MCMCParams(start=start, num_iterations=1000) chain = MCMCChain(mcmc_sampler, mcmc_params) chain.run() self.assertAlmostEqual(norm(mean(chain.samples, 0) - ps), 0, delta=0.2)
def test_construct_proposal(self): dimension = 3 num_history = 4 ps = rand(dimension) distribution = Bernoulli(ps) kernel = HypercubeKernel(1.) Z = randint(0, 2, (num_history, dimension)).astype(numpy.bool8) threshold = 0.5 spread = 0.5 sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) y = randint(0, 2, dimension).astype(dtype=numpy.bool8) p = sampler.construct_proposal(y) self.assertTrue(isinstance(p, DiscreteRandomWalkProposal)) self.assertEqual(p.spread, spread)
def test_construct_proposal(self): dimension = 3 num_history = 4 ps = rand(dimension) distribution = Bernoulli(ps) kernel = HypercubeKernel(1.) Z = randint(0, 2, (num_history, dimension)).astype(numpy.bool8) threshold = 0.5 spread = 0.5 sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) y = randint(0, 2, dimension).astype(dtype=numpy.bool8) p = sampler.construct_proposal(y) self.assertTrue(isinstance(p, DiscreteRandomWalkProposal)) self.assertEqual(p.spread, spread)
def main(): d = 5 b = randn(d) V = randn(d, d) W = V + V.T fill_diagonal(W, zeros(d)) hopfield = Hopfield(W, b) current_state = [rand() < 0.5 for _ in range(d)] distribution = HopfieldFullConditionals(full_target=hopfield, current_state=current_state) print("Running Gibbs to produce chain history") Z = sample_gibbs(distribution, num_samples=2000)[1500:].astype(numpy.bool8) inds = permutation(len(Z)) Z = Z[inds[:500]] print("done") threshold = 0.8 spread = 0.2 gamma = 0.2 kernel = HypercubeKernel(gamma) mcmc_sampler = DiscreteKameleon(hopfield, kernel, Z, threshold, spread) start = zeros(distribution.dimension, dtype=numpy.bool8) mcmc_params = MCMCParams(start=start, num_iterations=10000) chain = MCMCChain(mcmc_sampler, mcmc_params) chain.append_mcmc_output(StatisticsOutput(plot_times=True)) chain.append_mcmc_output(DiscretePlottingOutput(plot_from=0, lag=500)) chain.run()
def run_kameleon_chain(Z, hopfield, start, num_iterations): threshold = 0.8 spread = 0.03 gamma = 0.2 kernel = HypercubeKernel(gamma) sampler = DiscreteKameleon(hopfield, kernel, Z, threshold, spread) params = MCMCParams(start=start, num_iterations=num_iterations) chain = MCMCChain(sampler, params) chain.run() return chain
def test_contructor(self): dimension = 3 ps = rand(dimension) distribution = Bernoulli(ps) kernel = HypercubeKernel(1.) Z = zeros((2, distribution.dimension)) threshold = 0.5 spread = 0.5 sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) self.assertEqual(sampler.distribution, distribution) self.assertEqual(sampler.kernel, kernel) self.assertTrue(sampler.Z is Z) self.assertEqual(sampler.threshold, threshold) self.assertEqual(sampler.spread, spread)
def test_adapt_does_nothing(self): dimension = 3 ps = rand(dimension) distribution = Bernoulli(ps) kernel = HypercubeKernel(1.) Z = zeros((2, distribution.dimension)) threshold = 0.5 spread = .5 sampler = DiscreteKameleon(distribution, kernel, Z, threshold, spread) # serialise, call adapt, load, compare f = NamedTemporaryFile() dump(sampler, f) f.seek(0) sampler_copy = load(f) f.close() sampler.adapt(None, None) # rough check for equality, dont do a proper one here self.assertEqual(type(sampler_copy.kernel), type(sampler.kernel)) self.assertEqual(sampler_copy.kernel.gamma, sampler.kernel.gamma) self.assertEqual(type(sampler_copy.distribution), type(sampler.distribution)) self.assertEqual(sampler_copy.distribution.dimension, sampler.distribution.dimension) self.assertEqual(type(sampler_copy.Z), type(sampler.Z)) self.assertEqual(sampler_copy.Z.shape, sampler.Z.shape) self.assertAlmostEqual(norm(sampler_copy.Z - sampler.Z), 0) self.assertEqual(sampler_copy.spread, sampler.spread) # this is none, so just compare self.assertEqual(sampler.Q, sampler_copy.Q)