FitGaussian.h
Classes
- FitGaussian -- Multidimensional fitter class for Gaussians. (full description)
Interface
- Public Members
- FitGaussian()
- FitGaussian(uInt dimension)
- FitGaussian(uInt dimension, uInt numgaussians)
- void setDimensions(uInt dimensions)
- void setNumGaussians(uInt numgaussians)
- void setFirstEstimate(const Matrix<T>& estimate)
- void setMaxRetries(uInt nretries)
- void setMaxTime(Double maxtime)
- void setRetryFactors()
- void setRetryFactors(const Matrix<T>& retryfactors)
- uInt nRetryFactors()
- Bool &mask(uInt gaussian, uInt parameter)
- const Bool &mask(uInt gaussian, uInt parameter) const
- Matrix<T> fit(const Matrix<T>& pos, const Vector<T>& f, T maximumRMS = 1.0, uInt maxiter = 1024, T convcriteria = 0.0001)
- Matrix<T> fit(const Matrix<T>& pos,const Vector<T>& f, const Vector<T>& sigma, T maximumRMS = 1.0, uInt maxiter = 1024, T convcriteria = 0.0001)
- void correctParameters(Matrix<T>& parameters)
- T chisquared()
- T RMS()
- Bool converged()
- Private Members
- Matrix<T> defaultRetryMatrix()
- void expandRetryMatrix(uInt rowstoadd)
- uInt countFreeParameters()
Review Status
- Programs:
- Tests:
Prerequisite
Etymology
Fits Gaussians to data.
Synopsis
FitGaussian is specially designed for fitting procedures in
code that must be generalized for general dimensionality and
number of components, and for complicated fits where the failure rate of
the standard nonlinear fitter is unacceptibly high.
FitGaussian essentially provides a Gaussian-adapted
interface for NonLinearFitLM. The user specifies the dimension,
number of gaussians, initial estimate, retry factors, and the data,
and the fitting proceeds automatically. Upon failure of the fitter it will
retry the fit according to the retry factors until a fit is completed
successfully. The user can optionally require as a criterion for success
that the RMS of the fit residuals not exceed some maximum value.
The retry factors are applied in different ways: the height and widths
are multiplied by the retry factors while the center and angles are
increased by their factors. As of 2002/07/12 these are applied randomly
(instead of sequentially) to different components and combinations of
components. The factors can be specified by the user, but a default
set is available. This random method is better than the sequential method
for a limited number of retries, but true optimization of the retry system
would demand the use of a more sophisticated method.
Example
FitGaussian<Double> fitgauss(1,1);
Matrix<Double> x(5,1); x(0,0) = 0; x(1,0) = 1; x(2,0) = 2; x(3,0) = 3; x(4,0) = 4;
Vector<Double> y(5); y(0) = 0; y(1) = 1; y(2) = 4; y(3) = 1; y(4) = 1;
Matrix<Double> estimate(1,3);
estimate(0,0) = 1; estimate(0,1) = 1; estimate(0,2) = 1;
fitgauss.setFirstEstimate(estimate);
Matrix<Double> solution;
solution = fitgauss.fit(x,y);
cout << solution;
Motivation
Fitting multiple Gaussians is required for many different applications,
but requires a substantial amount of coding - especially if the
dimensionality of the image is not known to the programmer. Furthermore,
fitting multiple Gaussians has a very high failure rate. So, a specialized
Gaussian fitting class that retries from different initial estimates
until an acceptible fit was found was needed.
Template Type Argument Requirements (T)
- T must be a real data type compatible with NonLinearFitLM - Float or
Double.
Thrown Exceptions
- AipsError if dimension is not 1, 2, or 3
- AipsError if incorrect parameter number specified.
- AipsError if estimate/retry/data arrays are of wrong dimension
To Do
- Optimize the default retry matrix
- Send fitting messages to logger instead of console
- Consider using a more sophisticated retry ststem (above).
- Check the estimates for reasonability, especially on failure of fit.
- Consider adding other models (polynomial, etc) to make this a Fit3D
class.
Member Description
Create the fitter. The dimension and the number of gaussians to fit
can be modified later if necessary.
Adjust the number of dimensions
Adjust the number of gaussians to fit
Set the initial estimate (the starting point of the first fit.)
Set the maximum number of retries.
void setMaxTime(Double maxtime)
Set the maximum amount of time to spend (in seconds). If time runs out
during a fit the process will still complete that fit.
Set the retry factors, the values that are added/multiplied with the
first estimate on subsequent attempts if the first attempt fails.
Using the function with no argument sets the retry factors to the default.
Return the number of retry options available
Bool &mask(uInt gaussian, uInt parameter)
Mask out some parameters so that they are not modified during fitting
const Bool &mask(uInt gaussian, uInt parameter) const
Matrix<T> fit(const Matrix<T>& pos, const Vector<T>& f, T maximumRMS = 1.0, uInt maxiter = 1024, T convcriteria = 0.0001)
Run the fit, using the data provided in the arguments pos and f.
The fit will retry from different initial estimates until it converges
to a value with an RMS error less than maximumRMS. If this cannot be
accomplished it will simply take the result that generated the best RMS.
Matrix<T> fit(const Matrix<T>& pos,const Vector<T>& f, const Vector<T>& sigma, T maximumRMS = 1.0, uInt maxiter = 1024, T convcriteria = 0.0001)
Internal function for ensuring that parameters stay within their stated
domains (see Gaussian2D and Gaussian3D.)
Return the chi squared of the fit
Return the RMS of the fit
Returns True if the fit (eventually) converged to a value.
masks parameters not to change in fitting
Sets the retry matrix to a default value. This is done automatically if
the retry matrix is not set directly.
Add one or more rows to the retry matrix.
Find the number of unmasked parameters to be fit