Class LevenbergMarquardtMethod
- java.lang.Object
-
- elki.math.linearalgebra.fitting.LevenbergMarquardtMethod
-
public class LevenbergMarquardtMethod extends java.lang.Object
Function parameter fitting using Levenberg-Marquardt method.The Levenberg-Marquardt Algorithm (LMA) is a combination of the Gauss-Newton Algorithm (GNA) and the method of steepest descent. As such it usually gives more stable results and better convergence.
Implemented loosely based on the book:
Numerical Recipes In C: The Art Of Scientific Computing
Press, W.H. and Teukolsky, S.A. and Vetterling, W.T. and Flannery, B.P.
Cambridge University Press, Cambridge, Mass, 1992Due to their license, we cannot use their code, but we have to implement the mathematics ourselves. We hope the loss in precision isn't too big.
TODO: Replace implementation by one based on
M.I.A. Lourakis levmar
Levenberg-Marquardt nonlinear least squares algorithms in C/C++Which supposedly offers increased robustness.
- Since:
- 0.2
- Author:
- Erich Schubert
-
-
Field Summary
Fields Modifier and Type Field Description private double[][]
alpha
Working space for alphasprivate double[]
beta
private double
chisq
Chi-Squared information for parametersprivate double[][]
covmat
Working space for covariance matrixprivate double[]
deltaparams
private boolean[]
dofit
Which parameters to fitFittingFunction
func
Function to fit toprivate double
lambda
Lambda (refinement step size)int
maxruns
Maximum number of iterations in run()int
maxsmall
Maximum number of small improvements (stopping condition)private int
numfit
Number of parameters to fitprivate int
numparams
Number of parametersprivate double[]
params
Parameters to use in fittingprivate double[]
paramstry
More working buffersprivate double[]
s
double
small
"Small value" condition for stoppingprivate double[]
x
Data to fit the function toprivate double[]
y
-
Constructor Summary
Constructors Constructor Description LevenbergMarquardtMethod(FittingFunction func, double[] params, boolean[] dofit, double[] x, double[] y, double[] s)
Function fitting using Levenberg-Marquardt Method.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description double
getChiSq()
Get current ChiSquared (squared error sum)double[][]
getCovmat()
Get the final covariance matrix.double[]
getParams()
Get current parameters.void
iterate()
Perform an iteration of the approximation loop.void
run()
Iterate until convergence, at most 100 times.private double
simulateParameters(double[] curparams)
Compute new chisquared error
-
-
-
Field Detail
-
func
public FittingFunction func
Function to fit to
-
x
private double[] x
Data to fit the function to
-
y
private double[] y
-
s
private double[] s
-
numparams
private int numparams
Number of parameters
-
params
private double[] params
Parameters to use in fitting
-
chisq
private double chisq
Chi-Squared information for parameters
-
numfit
private int numfit
Number of parameters to fit
-
dofit
private boolean[] dofit
Which parameters to fit
-
covmat
private double[][] covmat
Working space for covariance matrix
-
alpha
private double[][] alpha
Working space for alphas
-
lambda
private double lambda
Lambda (refinement step size)
-
paramstry
private double[] paramstry
More working buffers
-
beta
private double[] beta
-
deltaparams
private double[] deltaparams
-
maxruns
public int maxruns
Maximum number of iterations in run()
-
maxsmall
public int maxsmall
Maximum number of small improvements (stopping condition)
-
small
public double small
"Small value" condition for stopping
-
-
Constructor Detail
-
LevenbergMarquardtMethod
public LevenbergMarquardtMethod(FittingFunction func, double[] params, boolean[] dofit, double[] x, double[] y, double[] s)
Function fitting using Levenberg-Marquardt Method.- Parameters:
func
- Function to fit tox
- Measurement pointsy
- Actual function valuess
- Confidence / Variance in measurement dataparams
- Initial parametersdofit
- Flags on which parameters to optimize
-
-
Method Detail
-
simulateParameters
private double simulateParameters(double[] curparams)
Compute new chisquared errorThis function also modifies the alpha and beta matrixes!
- Parameters:
curparams
- Parameters to use in computation.- Returns:
- new chi squared
-
iterate
public void iterate()
Perform an iteration of the approximation loop.
-
getCovmat
public double[][] getCovmat()
Get the final covariance matrix.Parameters that were not to be optimized are filled with zeros.
- Returns:
- covariance matrix for all parameters
-
getParams
public double[] getParams()
Get current parameters.- Returns:
- parameters
-
getChiSq
public double getChiSq()
Get current ChiSquared (squared error sum)- Returns:
- error measure
-
run
public void run()
Iterate until convergence, at most 100 times.
-
-