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)
Exemplo n.º 3
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)
Exemplo n.º 4
0
    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
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
    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)