# Reducing the number of Gaussians in a Gaussian Mixture Model

I build a kernel density estimation (KDE) of Gaussian kernels. I have many samples, but the distribution is not too complicated. I think it should be possible to approximate the resulting KDE by a much smaller number of Gaussian functions. This for the background. I would like to formulate it a bit more general though:

Let us assume, we have a number N of Gaussians of the form

 G(x | a, b, c) = a*exp((x-b)^2/c^2)


that we add up to the total function

 F(x) = sum_i=1^N ( G_1(x | a_i, b_i, c_i) )


Now I would like to find a new set of M Gaussians where M < N, such that the sum of them is still F(x). Does such a method already exist - if yes, how can I do this?

• If you have some goodness-of-fit measure such as RMSE, in the scenario you describe two Gaussians will give a smaller RMSE than one. If the ideal number is four, but you do not know this, then you should see only marginal improvement going from four to five. It seems to me there is a possibility of iteratively increasing the number, starting at one, until effectively little or no increase in goodness-of-fit is observed. You would have to determine a suitable cutoff value, such as less than 5 percent improvement or some other value, but this can then be automated. – James Phillips Apr 27 '18 at 15:03
• @James: that is something considered, but I hoped there'd me a mire elefant way. And how would you fit the Gaussians? By sampling the original Function and using Bayesian Optimization to fit the new F(x)? I remember there was a paper to my question, but I can' find it anymore. – Make42 Apr 29 '18 at 5:56
• I use the Differential Evolution genetic algorithm to provide initial parameter estimates for non-linear solvers when curve fitting. The Python module scipy.optimize.differential_evolution can be used for this purpose, I have an example of fitting a double Lorentzian peak equation to Raman spectroscopy of carbon nanotube at bitbucket.org/zunzuncode/RamanSpectroscopyFit if it might be of use. The scipy module uses the Latin Hypercube algorithm to ensure a thorough search of parameter space and so requires parameter bounds within which to search, but those bounds can be quite generous. – James Phillips Apr 29 '18 at 11:13