Split and Merge Expectation-Maximization (SMEM) algorithm for estimation of mixture model structure and parameters, with generalized internal estimations.


[theta, D] = smem(data, num)
[theta, D] = smem(data, num, options)
[theta, D, info] = smem(...)
[theta, D, info, options] = smem(...)


This function implements the SMEM algorithm proposed by Ueda et al. (2000), though here we use generalized optimization methods.

[theta, D] = smem(data, num) returns the estimated parameters and the mixture distribution D with num components, fitted to data.

[theta, D] = smem(data, num, options) utilizes applicable options from the options structure in the estimation procedure.

[theta, D, info] = smem(...) also returns info, a structure array containing information about successive iterations performed by iterative estimation functions.

[theta, D, info, options] = smem(...) also returns the effective options used, so you can see what default values the function used on top of the options you possibly specified.

For information about the output theta, see Distribution Parameters Structure. The input argument data is described in Data Input Argument to Functions. You may also want to read about options or info arguments.

Available Options

This function supports all the options described in estimation options. This function accepts the following additional fields in

  • maxCands (default 5) : Maximum number of merge candidates.
  • componentD (default MVN distribution) : distribution structure defining the mixture component distribution type.

options.inner can be used to set specific options for the inner estimations. To set options only for the partial or full inner estimations use options.inner.partial or options.inner.full respectively.

Returned info fields

The fields present in the returned info structure array, depend on the solver used (options.solver). When a Manopt solver is specified, the info returned by the Manopt solver is returned directly. For the 'default' solver see the documentation of the 'estimatedefault' function for the mixture distribution. You can read more at our documentation on estimation statistics structure.


% generate 1000 random data points
data = randn(1,1000) .* 2 + 1;
% set some options
options.solver = 'cg';
options.verbosity = 2; = 3;
options.inner.partial.maxiter = 10;
% fit mixture model to data
[theta, D] = smem(data, 5, options)


  1. N. Ueda, R. Nakano, Z. Ghahramani, and G. E. Hinton, “Split and Merge EM Algorithm for Improving Gaussian Mixture Density Estimates,” The Journal of VLSI Signal Processing-Systems for Signal, Image, and Video Technology, vol. 26, no. 1–2, pp. 133–140, Aug. 2000.