annotate toolboxes/FullBNT-1.0.7/netlab3.3/demhmc1.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
wolffd@0 1 %DEMHMC1 Demonstrate Hybrid Monte Carlo sampling on mixture of two Gaussians.
wolffd@0 2 %
wolffd@0 3 % Description
wolffd@0 4 % The problem consists of generating data from a mixture of two
wolffd@0 5 % Gaussians in two dimensions using a hybrid Monte Carlo algorithm with
wolffd@0 6 % persistence. A mixture model is then fitted to the sample to compare
wolffd@0 7 % it with the true underlying generator.
wolffd@0 8 %
wolffd@0 9 % See also
wolffd@0 10 % DEMHMC3, HMC, DEMPOT, DEMGPOT
wolffd@0 11 %
wolffd@0 12
wolffd@0 13 % Copyright (c) Ian T Nabney (1996-2001)
wolffd@0 14
wolffd@0 15
wolffd@0 16 dim = 2; % Data dimension
wolffd@0 17 ncentres = 2; % Number of centres in mixture model
wolffd@0 18
wolffd@0 19 seed = 42; % Seed for random weight initialization.
wolffd@0 20 randn('state', seed);
wolffd@0 21 rand('state', seed);
wolffd@0 22
wolffd@0 23 clc
wolffd@0 24 disp('This demonstration illustrates the use of the hybrid Monte Carlo')
wolffd@0 25 disp('algorithm to sample from a mixture of two Gaussians.')
wolffd@0 26 disp('The means of the two components are [0 0] and [2 2].')
wolffd@0 27 disp(' ')
wolffd@0 28 disp('First we set up the parameters of the mixture model we are sampling')
wolffd@0 29 disp('from.')
wolffd@0 30 disp(' ')
wolffd@0 31 disp('Press any key to continue.')
wolffd@0 32 pause
wolffd@0 33
wolffd@0 34 % Set up mixture model to sample from
wolffd@0 35 mix = gmm(dim, ncentres, 'spherical');
wolffd@0 36 mix.centres(1, :) = [0 0];
wolffd@0 37 mix.centres(2, :) = [2 2];
wolffd@0 38 x = [0 1]; % Start vector
wolffd@0 39
wolffd@0 40 % Set up vector of options for hybrid Monte Carlo.
wolffd@0 41
wolffd@0 42 nsamples = 160; % Number of retained samples.
wolffd@0 43
wolffd@0 44 options = foptions; % Default options vector.
wolffd@0 45 options(1) = 1; % Switch on diagnostics.
wolffd@0 46 options(5) = 1; % Use persistence
wolffd@0 47 options(7) = 50; % Number of steps in trajectory.
wolffd@0 48 options(14) = nsamples; % Number of Monte Carlo samples returned.
wolffd@0 49 options(15) = 30; % Number of samples omitted at start of chain.
wolffd@0 50 options(18) = 0.02;
wolffd@0 51
wolffd@0 52 clc
wolffd@0 53 disp(['Next we take ', num2str(nsamples),' samples from the distribution.'...
wolffd@0 54 , 'The first ', num2str(options(15))])
wolffd@0 55 disp('samples at the start of the chain are omitted. As persistence')
wolffd@0 56 disp('is used, the momentum has a small random component added at each step.')
wolffd@0 57 disp([num2str(options(7)), ...
wolffd@0 58 ' iterations are used at each step and the step size is ',...
wolffd@0 59 num2str(options(18))])
wolffd@0 60 disp('Sampling starts at the point [0 1].')
wolffd@0 61 disp('The new state is accepted if the threshold value is greater than')
wolffd@0 62 disp('a random number between 0 and 1.')
wolffd@0 63 disp(' ')
wolffd@0 64 disp('Negative step numbers indicate samples discarded from the start of the')
wolffd@0 65 disp('chain.')
wolffd@0 66 disp(' ')
wolffd@0 67 disp('Press any key to continue.')
wolffd@0 68 pause
wolffd@0 69
wolffd@0 70 [samples, energies] = hmc('dempot', x, options, 'demgpot', mix);
wolffd@0 71
wolffd@0 72 disp(' ')
wolffd@0 73 disp('Press any key to continue.')
wolffd@0 74 pause
wolffd@0 75 clc
wolffd@0 76 disp('The plot shows the samples generated by the HMC function.')
wolffd@0 77 disp('The different colours are used to show how the samples move from')
wolffd@0 78 disp('one component to the other over time.')
wolffd@0 79 disp(' ')
wolffd@0 80 disp('Press any key to continue.')
wolffd@0 81 pause
wolffd@0 82 probs = exp(-energies);
wolffd@0 83 fh1 = figure;
wolffd@0 84 % Plot data in 4 groups
wolffd@0 85 ngroups = 4;
wolffd@0 86 g1end = floor(nsamples/ngroups);
wolffd@0 87 g2end = floor(2*nsamples/ngroups);
wolffd@0 88 g3end = floor(3*nsamples/ngroups);
wolffd@0 89 p1 = plot(samples(1:g1end,1), samples(1:g1end,2), 'k.', 'MarkerSize', 12);
wolffd@0 90 hold on
wolffd@0 91 lstrings = char(['Samples 1-' int2str(g1end)], ...
wolffd@0 92 ['Samples ' int2str(g1end+1) '-' int2str(g2end)], ...
wolffd@0 93 ['Samples ' int2str(g2end+1) '-' int2str(g3end)], ...
wolffd@0 94 ['Samples ' int2str(g3end+1) '-' int2str(nsamples)]);
wolffd@0 95 p2 = plot(samples(g1end+1:g2end,1), samples(g1end+1:g2end,2), ...
wolffd@0 96 'r.', 'MarkerSize', 12);
wolffd@0 97 p3 = plot(samples(g2end+1:g3end,1), samples(g2end+1:g3end,2), ...
wolffd@0 98 'g.', 'MarkerSize', 12);
wolffd@0 99 p4 = plot(samples(g3end+1:nsamples,1), samples(g3end+1:nsamples,2), ...
wolffd@0 100 'b.', 'MarkerSize', 12);
wolffd@0 101 legend([p1 p2 p3 p4], lstrings, 2);
wolffd@0 102
wolffd@0 103 clc
wolffd@0 104 disp('We now fit a Gaussian mixture model to the sampled data.')
wolffd@0 105 disp('The model has spherical covariance structure and the correct')
wolffd@0 106 disp('number of components.')
wolffd@0 107 disp(' ')
wolffd@0 108 disp('Press any key to continue.')
wolffd@0 109 pause
wolffd@0 110 % Fit a mixture model to the sample
wolffd@0 111 newmix = gmm(dim, ncentres, 'spherical');
wolffd@0 112 options = foptions;
wolffd@0 113 options(1) = -1; % Switch off all diagnostics
wolffd@0 114 options(14) = 5; % Just use 5 iterations of k-means in initialisation
wolffd@0 115 % Initialise the model parameters from the samples
wolffd@0 116 newmix = gmminit(newmix, samples, options);
wolffd@0 117
wolffd@0 118 % Set up vector of options for EM trainer
wolffd@0 119 options = zeros(1, 18);
wolffd@0 120 options(1) = 1; % Prints out error values.
wolffd@0 121 options(14) = 15; % Max. Number of iterations.
wolffd@0 122
wolffd@0 123 disp('We now train the model using the EM algorithm for 15 iterations')
wolffd@0 124 disp(' ')
wolffd@0 125 disp('Press any key to continue')
wolffd@0 126 pause
wolffd@0 127 [newmix, options, errlog] = gmmem(newmix, samples, options);
wolffd@0 128
wolffd@0 129 % Print out model
wolffd@0 130 disp(' ')
wolffd@0 131 disp('The trained model has parameters ')
wolffd@0 132 disp(' Priors Centres Variances')
wolffd@0 133 disp([newmix.priors' newmix.centres newmix.covars'])
wolffd@0 134 disp('Note the close correspondence between these parameters and those')
wolffd@0 135 disp('of the distribution used to generate the data')
wolffd@0 136 disp(' ')
wolffd@0 137 disp(' Priors Centres Variances')
wolffd@0 138 disp([mix.priors' mix.centres mix.covars'])
wolffd@0 139 disp(' ')
wolffd@0 140 disp('Press any key to exit')
wolffd@0 141 pause
wolffd@0 142
wolffd@0 143 close(fh1);
wolffd@0 144 clear all;
wolffd@0 145