diff toolboxes/FullBNT-1.0.7/netlab3.3/gmm.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/gmm.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,113 @@
+function mix = gmm(dim, ncentres, covar_type, ppca_dim)
+%GMM	Creates a Gaussian mixture model with specified architecture.
+%
+%	Description
+%	 MIX = GMM(DIM, NCENTRES, COVARTYPE) takes the dimension of the space
+%	DIM, the number of centres in the mixture model and the type of the
+%	mixture model, and returns a data structure MIX. The mixture model
+%	type defines the covariance structure of each component  Gaussian:
+%	  'spherical' = single variance parameter for each component: stored as a vector
+%	  'diag' = diagonal matrix for each component: stored as rows of a matrix
+%	  'full' = full matrix for each component: stored as 3d array
+%	  'ppca' = probabilistic PCA: stored as principal components (in a 3d array
+%	    and associated variances and off-subspace noise
+%	 MIX = GMM(DIM, NCENTRES, COVARTYPE, PPCA_DIM) also sets the
+%	dimension of the PPCA sub-spaces: the default value is one.
+%
+%	The priors are initialised to equal values summing to one, and the
+%	covariances are all the identity matrix (or equivalent).  The centres
+%	are initialised randomly from a zero mean unit variance Gaussian.
+%	This makes use of the MATLAB function RANDN and so the seed for the
+%	random weight initialisation can be set using RANDN('STATE', S) where
+%	S is the state value.
+%
+%	The fields in MIX are
+%	  
+%	  type = 'gmm'
+%	  nin = the dimension of the space
+%	  ncentres = number of mixture components
+%	  covartype = string for type of variance model
+%	  priors = mixing coefficients
+%	  centres = means of Gaussians: stored as rows of a matrix
+%	  covars = covariances of Gaussians
+%	 The additional fields for mixtures of PPCA are
+%	  U = principal component subspaces
+%	  lambda = in-space covariances: stored as rows of a matrix
+%	 The off-subspace noise is stored in COVARS.
+%
+%	See also
+%	GMMPAK, GMMUNPAK, GMMSAMP, GMMINIT, GMMEM, GMMACTIV, GMMPOST, 
+%	GMMPROB
+%
+
+%	Copyright (c) Ian T Nabney (1996-2001)
+
+if ncentres < 1
+  error('Number of centres must be greater than zero')
+end
+
+mix.type = 'gmm';
+mix.nin = dim;
+mix.ncentres = ncentres;
+
+vartypes = {'spherical', 'diag', 'full', 'ppca'};
+
+if sum(strcmp(covar_type, vartypes)) == 0
+  error('Undefined covariance type')
+else
+  mix.covar_type = covar_type;
+end
+
+% Make default dimension of PPCA subspaces one.
+if strcmp(covar_type, 'ppca')
+  if nargin < 4
+    ppca_dim = 1;
+  end
+  if ppca_dim > dim
+    error('Dimension of PPCA subspaces must be less than data.')
+  end
+  mix.ppca_dim = ppca_dim;
+end
+
+% Initialise priors to be equal and summing to one
+mix.priors = ones(1,mix.ncentres) ./ mix.ncentres;
+
+% Initialise centres
+mix.centres = randn(mix.ncentres, mix.nin);
+
+% Initialise all the variances to unity
+switch mix.covar_type
+
+case 'spherical'
+  mix.covars = ones(1, mix.ncentres);
+  mix.nwts = mix.ncentres + mix.ncentres*mix.nin + mix.ncentres;
+case 'diag'
+  % Store diagonals of covariance matrices as rows in a matrix
+  mix.covars =  ones(mix.ncentres, mix.nin);
+  mix.nwts = mix.ncentres + mix.ncentres*mix.nin + ...
+    mix.ncentres*mix.nin;
+case 'full'
+  % Store covariance matrices in a row vector of matrices
+  mix.covars = repmat(eye(mix.nin), [1 1 mix.ncentres]);
+  mix.nwts = mix.ncentres + mix.ncentres*mix.nin + ...
+    mix.ncentres*mix.nin*mix.nin;
+case 'ppca'
+  % This is the off-subspace noise: make it smaller than
+  % lambdas
+  mix.covars = 0.1*ones(1, mix.ncentres);
+  % Also set aside storage for principal components and
+  % associated variances
+  init_space = eye(mix.nin);
+  init_space = init_space(:, 1:mix.ppca_dim);
+  init_space(mix.ppca_dim+1:mix.nin, :) = ...
+    ones(mix.nin - mix.ppca_dim, mix.ppca_dim);
+  mix.U = repmat(init_space , [1 1 mix.ncentres]);
+  mix.lambda = ones(mix.ncentres, mix.ppca_dim);
+  % Take account of additional parameters
+  mix.nwts = mix.ncentres + mix.ncentres*mix.nin + ...
+    mix.ncentres + mix.ncentres*mix.ppca_dim + ...
+    mix.ncentres*mix.nin*mix.ppca_dim;
+otherwise
+  error(['Unknown covariance type ', mix.covar_type]);               
+end
+