Mercurial > pylearn
view pylearn/sampling/tests/test_hmc.py @ 1374:8b61566b0d36
small bug fix in test discovered by making Variable class raise an error about logical comparaison then checking if it is zero or not.
author | Frederic Bastien <nouiz@nouiz.org> |
---|---|
date | Thu, 18 Nov 2010 09:53:38 -0500 |
parents | 0ea25edd97e5 |
children | fbe470217937 |
line wrap: on
line source
from pylearn.sampling.hmc import * def _sampler_on_2d_gaussian(sampler_cls, burnin, n_samples): batchsize=3 rng = np.random.RandomState(234) # # Define a covariance and mu for a gaussian # tmp = rng.randn(2,2).astype(theano.config.floatX) tmp[0] += tmp[1] #induce some covariance cov = np.dot(tmp, tmp.T) cov_inv = np.linalg.inv(cov).astype(theano.config.floatX) mu = np.asarray([5, 9.5], dtype=theano.config.floatX) def gaussian_energy(xlist): x = xlist return 0.5 * (TT.dot((x-mu),cov_inv)*(x-mu)).sum(axis=1) position = shared(rng.randn(batchsize, 2).astype(theano.config.floatX)) sampler = sampler_cls(position, gaussian_energy) print 'initial position', position.value print 'initial stepsize', sampler.stepsize.value # DRAW SAMPLES samples = [sampler.draw() for r in xrange(burnin)] #burn-in samples = np.asarray([sampler.draw() for r in xrange(n_samples)]) assert sampler.avg_acceptance_rate.value > 0 assert sampler.avg_acceptance_rate.value < 1 # TEST THAT THEY ARE FROM THE RIGHT DISTRIBUTION # samples.shape == (1000, 3, 2) print 'target mean:', mu print 'empirical mean: ', samples.mean(axis=0) #assert np.all(abs(mu - samples.mean(axis=0)) < 1) print 'final stepsize', sampler.stepsize.value print 'final acceptance_rate', sampler.avg_acceptance_rate.value print 'target cov', cov s = samples[:,0,:] empirical_cov = np.cov(samples[:,0,:].T) print '' print 'cov/empirical_cov', cov/empirical_cov empirical_cov = np.cov(samples[:,1,:].T) print 'cov/empirical_cov', cov/empirical_cov empirical_cov = np.cov(samples[:,2,:].T) print 'cov/empirical_cov', cov/empirical_cov return sampler def test_hmc(): print ('HMC') sampler = _sampler_on_2d_gaussian(HMC_sampler.new_from_shared_positions, burnin=3000/20, n_samples=90000/20) assert abs(sampler.avg_acceptance_rate.value - sampler.target_acceptance_rate) < .1 assert sampler.stepsize.value >= sampler.stepsize_min assert sampler.stepsize.value <= sampler.stepsize_max