Mercurial > pylearn
annotate pylearn/sampling/tests/test_hmc.py @ 1503:1ee532a6f33b
Fix import.
author | Frederic Bastien <nouiz@nouiz.org> |
---|---|
date | Mon, 12 Sep 2011 10:24:24 -0400 |
parents | fbe470217937 |
children | 5804e44d7a1b |
rev | line source |
---|---|
1503 | 1 import numpy |
2 import theano | |
3 from theano import tensor | |
4 | |
5 from pylearn.sampling.hmc import HMC_sampler | |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
6 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
7 def _sampler_on_2d_gaussian(sampler_cls, burnin, n_samples): |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
8 batchsize=3 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
9 |
1503 | 10 rng = numpy.random.RandomState(234) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
11 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
12 # |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
13 # Define a covariance and mu for a gaussian |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
14 # |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
15 tmp = rng.randn(2,2).astype(theano.config.floatX) |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
16 tmp[0] += tmp[1] #induce some covariance |
1503 | 17 cov = numpy.dot(tmp, tmp.T) |
18 cov_inv = numpy.linalg.inv(cov).astype(theano.config.floatX) | |
19 mu = numpy.asarray([5, 9.5], dtype=theano.config.floatX) | |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
20 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
21 def gaussian_energy(xlist): |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
22 x = xlist |
1503 | 23 return 0.5 * (tensor.dot((x-mu),cov_inv)*(x-mu)).sum(axis=1) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
24 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
25 |
1503 | 26 position = theano.shared(rng.randn(batchsize, 2).astype(theano.config.floatX)) |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
27 sampler = sampler_cls(position, gaussian_energy) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
28 |
1447
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
29 print 'initial position', position.get_value(borrow=True) |
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
30 print 'initial stepsize', sampler.stepsize.get_value(borrow=True) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
31 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
32 # DRAW SAMPLES |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
33 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
34 samples = [sampler.draw() for r in xrange(burnin)] #burn-in |
1503 | 35 samples = numpy.asarray([sampler.draw() for r in xrange(n_samples)]) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
36 |
1447
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
37 assert sampler.avg_acceptance_rate.get_value() > 0 |
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
38 assert sampler.avg_acceptance_rate.get_value() < 1 |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
39 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
40 # TEST THAT THEY ARE FROM THE RIGHT DISTRIBUTION |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
41 |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
42 # samples.shape == (1000, 3, 2) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
43 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
44 print 'target mean:', mu |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
45 print 'empirical mean: ', samples.mean(axis=0) |
1503 | 46 #assert numpy.all(abs(mu - samples.mean(axis=0)) < 1) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
47 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
48 |
1447
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
49 print 'final stepsize', sampler.stepsize.get_value() |
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
50 print 'final acceptance_rate', sampler.avg_acceptance_rate.get_value() |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
51 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
52 print 'target cov', cov |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
53 s = samples[:,0,:] |
1503 | 54 empirical_cov = numpy.cov(samples[:,0,:].T) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
55 print '' |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
56 print 'cov/empirical_cov', cov/empirical_cov |
1503 | 57 empirical_cov = numpy.cov(samples[:,1,:].T) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
58 print 'cov/empirical_cov', cov/empirical_cov |
1503 | 59 empirical_cov = numpy.cov(samples[:,2,:].T) |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
60 print 'cov/empirical_cov', cov/empirical_cov |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
61 return sampler |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
62 |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
63 def test_hmc(): |
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
64 print ('HMC') |
1265
d6665a5af743
hmc - replaced with new refactored code
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
955
diff
changeset
|
65 sampler = _sampler_on_2d_gaussian(HMC_sampler.new_from_shared_positions, burnin=3000/20, n_samples=90000/20) |
1447
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
66 assert abs(sampler.avg_acceptance_rate.get_value() - sampler.target_acceptance_rate) < .1 |
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
67 assert sampler.stepsize.get_value() >= sampler.stepsize_min |
fbe470217937
Use .get_value() and .set_value() of shared instead of the .value property
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
1374
diff
changeset
|
68 assert sampler.stepsize.get_value() <= sampler.stepsize_max |
955
492473059b37
Adding sampling module
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
69 |