Mercurial > hg > camir-aes2014
diff toolboxes/FullBNT-1.0.7/netlab3.3/demgtm1.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/FullBNT-1.0.7/netlab3.3/demgtm1.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,147 @@ +%DEMGTM1 Demonstrate EM for GTM. +% +% Description +% This script demonstrates the use of the EM algorithm to fit a one- +% dimensional GTM to a two-dimensional set of data using maximum +% likelihood. The location and spread of the Gaussian kernels in the +% data space is shown during training. +% +% See also +% DEMGTM2, GTM, GTMEM, GTMPOST +% + +% Copyright (c) Ian T Nabney (1996-2001) + +% Demonstrates the GTM with a 2D target space and a 1D latent space. +% +% This script generates a simple data set in 2 dimensions, +% with an intrinsic dimensionality of 1, and trains a GTM +% with a 1-dimensional latent variable to model this data +% set, visually illustrating the training process +% +% Synopsis: gtm_demo + +% Generate and plot a 2D data set + +data_min = 0.15; +data_max = 3.05; +T = [data_min:0.05:data_max]'; +T = [T (T + 1.25*sin(2*T))]; +fh1 = figure; +plot(T(:,1), T(:,2), 'ro'); +axis([data_min-0.05 data_max+0.05 data_min-0.05 data_max+0.05]); +clc; +disp('This demonstration shows in detail how the EM algorithm works') +disp('for training a GTM with a one dimensional latent space.') +disp(' ') +fprintf([... +'The figure shows data generated by feeding a 1D uniform distribution\n', ... +'(on the X-axis) through a non-linear function (y = x + 1.25*sin(2*x))\n', ... +'\nPress any key to continue ...\n\n']); +pause; + +% Generate a unit circle figure, to be used for plotting +src = [0:(2*pi)/(20-1):2*pi]'; +unitC = [sin(src) cos(src)]; + +% Generate and plot (along with the data) an initial GTM model + +clc; +num_latent_points = 20; +num_rbf_centres = 5; + +net = gtm(1, num_latent_points, 2, num_rbf_centres, 'gaussian'); + +options = zeros(1, 18); +options(7) = 1; +net = gtminit(net, options, T, 'regular', num_latent_points, ... + num_rbf_centres); + +mix = gtmfwd(net); +% Replot the figure +hold off; +plot(mix.centres(:,1), mix.centres(:,2), 'g'); +hold on; +for i=1:num_latent_points + c = 2*unitC*sqrt(mix.covars(1)) + [ones(20,1)*mix.centres(i,1) ... + ones(num_latent_points,1)*mix.centres(i,2)]; + fill(c(:,1), c(:,2), [0.8 1 0.8]); +end +plot(T(:,1), T(:,2), 'ro'); +plot(mix.centres(:,1), mix.centres(:,2), 'g+'); +plot(mix.centres(:,1), mix.centres(:,2), 'g'); +axis([data_min-0.05 data_max+0.05 data_min-0.05 data_max+0.05]); +drawnow; +title('Initial configuration'); +disp(' ') +fprintf([... +'The figure shows the starting point for the GTM, before the training.\n', ... +'A discrete latent variable distribution of %d points in 1 dimension \n', ... +'is mapped to the 1st principal component of the target data by an RBF.\n', ... +'with %d basis functions. Each of the %d points defines the centre of\n', ... +'a Gaussian in a Gaussian mixture, marked by the green ''+''-signs. The\n', ... +'mixture components all have equal variance, illustrated by the filled\n', ... +'circle around each ''+''-sign, the radii corresponding to 2 standard\n', ... +'deviations. The ''+''-signs are connected with a line according to their\n', ... +'corresponding ordering in latent space.\n\n', ... +'Press any key to begin training ...\n\n'], num_latent_points, ... +num_rbf_centres, num_latent_points); +pause; + +figure(fh1); +%%%% Train the GTM and plot it (along with the data) as training proceeds %%%% +options = foptions; +options(1) = -1; % Turn off all warning messages +options(14) = 1; +for j = 1:15 + [net, options] = gtmem(net, T, options); + hold off; + mix = gtmfwd(net); + plot(mix.centres(:,1), mix.centres(:,2), 'g'); + hold on; + for i=1:20 + c = 2*unitC*sqrt(mix.covars(1)) + [ones(20,1)*mix.centres(i,1) ... + ones(20,1)*mix.centres(i,2)]; + fill(c(:,1), c(:,2), [0.8 1.0 0.8]); + end + plot(T(:,1), T(:,2), 'ro'); + plot(mix.centres(:,1), mix.centres(:,2), 'g+'); + plot(mix.centres(:,1), mix.centres(:,2), 'g'); + axis([0 3.5 0 3.5]); + title(['After ', int2str(j),' iterations of training.']); + drawnow; + if (j == 4) + fprintf([... +'The GTM initially adapts relatively quickly - already after \n', ... +'4 iterations of training, a rough fit is attained.\n\n', ... +'Press any key to continue training ...\n\n']); +pause; +figure(fh1); + elseif (j == 8) + fprintf([... +'After another 4 iterations of training: from now on further \n', ... +'training only makes small changes to the mapping, which combined with \n', ... +'decrements of the Gaussian mixture variance, optimize the fit in \n', ... +'terms of likelihood.\n\n', ... +'Press any key to continue training ...\n\n']); +pause; +figure(fh1); + else + pause(1); + end +end + +clc; +fprintf([... +'After 15 iterations of training the GTM can be regarded as converged. \n', ... +'Is has been adapted to fit the target data distribution as well \n', ... +'as possible, given prior smoothness constraints on the mapping. It \n', ... +'captures the fact that the probabilty density is higher at the two \n', ... +'bends of the curve, and lower towards its end points.\n\n']); +disp(' '); +disp('Press any key to exit.'); +pause; + +close(fh1); +clear all; +