Created
September 9, 2013 13:14
-
-
Save erogol/6495411 to your computer and use it in GitHub Desktop.
Gaussian_mixture_model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, GMACTIV, GMPOST, | |
% GMPROB | |
% | |
% 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment