GaussianMixture
The GaussianMixture class implements a multivarate Gaussian mixture distribution.
The following examples can be found in the toolbox's examples.
Usage
Configure
% Configure a Gaussian mixture with 3 components: % 1) mean: [2.0, 0.5]', covariance: eye(2), weight: 0.5 % 2) mean: [-1, 3]', covariance: [2.0 0.5 % 0.5 1.0], weight: 0.25 % 3) mean: [-3, -1]', covariance: 3 * eye(2), weight: 0.25 means = [2.0 -1 -3 0.5 3 -1]; covs = cat(3, eye(2), [2.0 0.5; 0.5 1.0], 3 * eye(2)); weights = [0.5 0.25 0.25]; gm1 = GaussianMixture(means, covs, weights); % The component weights do not have to be normalized in advance. That % is, the GaussianMixture class normalizes the given weights anyway. % Hence, this results in the same, valid, Gaussian mixture: weights = [2 1 1]; gm2 = GaussianMixture(means, covs, weights); % If no weights are provided, the components are assumed to be equally weighted: gm3 = GaussianMixture(means, covs); % A Gaussian mixture can of course only have a single component gm4 = GaussianMixture(ones(3, 1), eye(3)); % An already initialized GaussianMixture can be changed by using its set() method: gm4.set([ones(3, 1), -5 * ones(3, 1)], cat(3, eye(3), 5 * eye(3)), [0.8 0.2]); gm4.set([ones(3, 1), -5 * ones(3, 1)], cat(3, eye(3), 5 * eye(3)));
Get Information
% Dimension of the distribution: dim = gm2.getDim(); % Get mean, covariance matrix and the lower Cholesky decomposition of % the distribution's covariance matrix: [mean, cov, covSqrt] = gm2.getMeanAndCov(); % Get the number of Gaussian mixture components: numComponents = gm2.getNumComponents(); % Get the Gaussian mixture components (note the now normalized weights): [means, covs, weights] = gm2.getComponents();
Draw Random Samples
% Draw eight random samples from gm1: samples = gm1.drawRndSamples(8);
Evaluate Logarithmic Probability Density Function (PDF)
% Get log PDF values of g1 for the points [2, -1]' and [5 10]': logValues = gm1.logPdf([ 2 5 -1 10]); % Or plot entire PDF of gm1: t = -5:0.1:5; [x, y] = meshgrid(t); pos = [x(:)' y(:)']; values = exp(gm1.logPdf(pos)); surf(x, y, reshape(values, [length(t) length(t)]), 'EdgeColor', 'None');
Copy
Note that any distribution, including the GaussianMixture, is implemented as a handle class. Hence, assigning a current class instance to a new variable means only passing a reference. If a real copy is required, use the distribution's copy method.
% Here, gm is only a reference to gm3 (no data is copied): gm = gm3; gm.set(zeros(2, 1), 3 * eye(2)); % Hence, the above set() call also changes gm3: [mean, cov] = gm3.getMeanAndCov(); % Use the distribution's copy() method for a real copy: gm = gm3.copy(); gm.set([1 2 3], cat(3, 2, 3, 5)); % Now, gm3 remains unchanged: [mean, cov] = gm3.getMeanAndCov();