org.apache.commons.math3.optimization.general

## Class LevenbergMarquardtOptimizer

- java.lang.Object
- - org.apache.commons.math3.optimization.direct.BaseAbstractMultivariateVectorOptimizer<DifferentiableMultivariateVectorFunction>
  - - org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer
    - - org.apache.commons.math3.optimization.general.LevenbergMarquardtOptimizer

- All Implemented Interfaces:
    BaseMultivariateVectorOptimizer<DifferentiableMultivariateVectorFunction>, BaseOptimizer<PointVectorValuePair>, DifferentiableMultivariateVectorOptimizer

  Deprecated.
  As of 3.1 (to be removed in 4.0).

      @Deprecated
      public class LevenbergMarquardtOptimizer
      extends AbstractLeastSquaresOptimizer

  This class solves a least squares problem using the Levenberg-Marquardt algorithm.

  This implementation should work even for over-determined systems (i.e. systems having more point than equations). Over-determined systems are solved by ignoring the point which have the smallest impact according to their jacobian column norm. Only the rank of the matrix and some loop bounds are changed to implement this.

  The resolution engine is a simple translation of the MINPACK lmder routine with minor changes. The changes include the over-determined resolution, the use of inherited convergence checker and the Q.R. decomposition which has been rewritten following the algorithm described in the P. Lascaux and R. Theodor book Analyse numérique matricielle appliquée à l'art de l'ingénieur, Masson 1986.

  The authors of the original fortran version are:

  - Argonne National Laboratory. MINPACK project. March 1980
  - Burton S. Garbow
  - Kenneth E. Hillstrom
  - Jorge J. More
  The redistribution policy for MINPACK is available here, for convenience, it is reproduced below.

  Minpack Copyright Notice (1999) University of Chicago. All rights reserved
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: `This product includes software developed by the University of Chicago, as Operator of Argonne National Laboratory.` Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND THEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF THE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4) DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL BE CORRECTED. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF ANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER SUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGES.

  Since:
    2.0
  Version:
    $Id: LevenbergMarquardtOptimizer.java 1423555 2012-12-18 18:02:52Z erans $

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `private double[]` | `beta` Deprecated. Coefficients of the Householder transforms vectors.
    `private double` | `costRelativeTolerance` Deprecated. Desired relative error in the sum of squares.
    `private double[]` | `diagR` Deprecated. Diagonal elements of the R matrix in the Q.R.
    `private double` | `initialStepBoundFactor` Deprecated. Positive input variable used in determining the initial step bound.
    `private double[]` | `jacNorm` Deprecated. Norms of the columns of the jacobian matrix.
    `private double[]` | `lmDir` Deprecated. Parameters evolution direction associated with lmPar.
    `private double` | `lmPar` Deprecated. Levenberg-Marquardt parameter.
    `private double` | `orthoTolerance` Deprecated. Desired max cosine on the orthogonality between the function vector and the columns of the jacobian.
    `private double` | `parRelativeTolerance` Deprecated. Desired relative error in the approximate solution parameters.
    `private int[]` | `permutation` Deprecated. Columns permutation array.
    `private double` | `qrRankingThreshold` Deprecated. Threshold for QR ranking.
    `private int` | `rank` Deprecated. Rank of the jacobian matrix.
    `private int` | `solvedCols` Deprecated. Number of solved point.
    `private double[][]` | `weightedJacobian` Deprecated. Weighted Jacobian.
    `private double[]` | `weightedResidual` Deprecated. Weighted residuals.

    - ### Fields inherited from class org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer

      `cols, cost, objective, point, rows, weightedResidualJacobian, weightedResiduals`

    - ### Fields inherited from class org.apache.commons.math3.optimization.direct.BaseAbstractMultivariateVectorOptimizer

      `evaluations`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `LevenbergMarquardtOptimizer()` Deprecated. Build an optimizer for least squares problems with default values for all the tuning parameters (see the `other contructor`.
    `LevenbergMarquardtOptimizer(ConvergenceChecker<PointVectorValuePair> checker)` Deprecated. Constructor that allows the specification of a custom convergence checker.
    `LevenbergMarquardtOptimizer(double initialStepBoundFactor, ConvergenceChecker<PointVectorValuePair> checker, double costRelativeTolerance, double parRelativeTolerance, double orthoTolerance, double threshold)` Deprecated. Constructor that allows the specification of a custom convergence checker, in addition to the standard ones.
    `LevenbergMarquardtOptimizer(double costRelativeTolerance, double parRelativeTolerance, double orthoTolerance)` Deprecated. Build an optimizer for least squares problems with default values for some of the tuning parameters (see the `other contructor`.
    `LevenbergMarquardtOptimizer(double initialStepBoundFactor, double costRelativeTolerance, double parRelativeTolerance, double orthoTolerance, double threshold)` Deprecated. The arguments control the behaviour of the default convergence checking procedure.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `private void` | `determineLMDirection(double[] qy, double[] diag, double[] lmDiag, double[] work)` Deprecated. Solve a*x = b and d*x = 0 in the least squares sense.
    `private void` | `determineLMParameter(double[] qy, double delta, double[] diag, double[] work1, double[] work2, double[] work3)` Deprecated. Determine the Levenberg-Marquardt parameter.
    `protected PointVectorValuePair` | `doOptimize()` Deprecated. Perform the bulk of the optimization algorithm.
    `private void` | `qrDecomposition(RealMatrix jacobian)` Deprecated. Decompose a matrix A as A.P = Q.R using Householder transforms.
    `private void` | `qTy(double[] y)` Deprecated. Compute the product Qt.y for some Q.R.

    - ### Methods inherited from class org.apache.commons.math3.optimization.general.AbstractLeastSquaresOptimizer

      `computeCost, computeCovariances, computeResiduals, computeSigma, computeWeightedJacobian, getChiSquare, getCovariances, getCovariances, getJacobianEvaluations, getRMS, getWeightSquareRoot, guessParametersErrors, optimize, optimize, optimizeInternal, setCost, setUp, updateJacobian, updateResidualsAndCost`

    - ### Methods inherited from class org.apache.commons.math3.optimization.direct.BaseAbstractMultivariateVectorOptimizer

      `computeObjectiveValue, getConvergenceChecker, getEvaluations, getMaxEvaluations, getObjectiveFunction, getStartPoint, getTarget, getTargetRef, getWeight, getWeightRef, optimize, optimizeInternal, optimizeInternal`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface org.apache.commons.math3.optimization.BaseOptimizer

      `getConvergenceChecker, getEvaluations, getMaxEvaluations`

- - ### Field Detail

    - #### solvedCols

          private int solvedCols

      Deprecated.
      Number of solved point.

    - #### diagR

          private double[] diagR

      Deprecated.
      Diagonal elements of the R matrix in the Q.R. decomposition.

    - #### jacNorm

          private double[] jacNorm

      Deprecated.
      Norms of the columns of the jacobian matrix.

    - #### beta

          private double[] beta

      Deprecated.
      Coefficients of the Householder transforms vectors.

    - #### permutation

          private int[] permutation

      Deprecated.
      Columns permutation array.

    - #### rank

          private int rank

      Deprecated.
      Rank of the jacobian matrix.

    - #### lmPar

          private double lmPar

      Deprecated.
      Levenberg-Marquardt parameter.

    - #### lmDir

          private double[] lmDir

      Deprecated.
      Parameters evolution direction associated with lmPar.

    - #### initialStepBoundFactor

          private final double initialStepBoundFactor

      Deprecated.
      Positive input variable used in determining the initial step bound.

    - #### costRelativeTolerance

          private final double costRelativeTolerance

      Deprecated.
      Desired relative error in the sum of squares.

    - #### parRelativeTolerance

          private final double parRelativeTolerance

      Deprecated.
      Desired relative error in the approximate solution parameters.

    - #### orthoTolerance

          private final double orthoTolerance

      Deprecated.
      Desired max cosine on the orthogonality between the function vector and the columns of the jacobian.

    - #### qrRankingThreshold

          private final double qrRankingThreshold

      Deprecated.
      Threshold for QR ranking.

    - #### weightedResidual

          private double[] weightedResidual

      Deprecated.
      Weighted residuals.

    - #### weightedJacobian

          private double[][] weightedJacobian

      Deprecated.
      Weighted Jacobian.

  - ### Constructor Detail

    - #### LevenbergMarquardtOptimizer

          public LevenbergMarquardtOptimizer()

      Deprecated.
      Build an optimizer for least squares problems with default values for all the tuning parameters (see the `other contructor`. The default values for the algorithm settings are:
      - Initial step bound factor: 100
      - Cost relative tolerance: 1e-10
      - Parameters relative tolerance: 1e-10
      - Orthogonality tolerance: 1e-10
      - QR ranking threshold: `Precision.SAFE_MIN`

    - #### LevenbergMarquardtOptimizer

          public LevenbergMarquardtOptimizer(ConvergenceChecker<PointVectorValuePair> checker)

      Deprecated.
      Constructor that allows the specification of a custom convergence checker. Note that all the usual convergence checks will be disabled. The default values for the algorithm settings are:
      - Initial step bound factor: 100
      - Cost relative tolerance: 1e-10
      - Parameters relative tolerance: 1e-10
      - Orthogonality tolerance: 1e-10
      - QR ranking threshold: `Precision.SAFE_MIN`
      Parameters:
        `checker` - Convergence checker.

    - #### LevenbergMarquardtOptimizer

          public LevenbergMarquardtOptimizer(double initialStepBoundFactor,
                                     ConvergenceChecker<PointVectorValuePair> checker,
                                     double costRelativeTolerance,
                                     double parRelativeTolerance,
                                     double orthoTolerance,
                                     double threshold)

      Deprecated.
      Constructor that allows the specification of a custom convergence checker, in addition to the standard ones.
      Parameters:
        `initialStepBoundFactor` - Positive input variable used in determining the initial step bound. This bound is set to the product of initialStepBoundFactor and the euclidean norm of `diag * x` if non-zero, or else to `initialStepBoundFactor` itself. In most cases factor should lie in the interval `(0.1, 100.0)`. `100` is a generally recommended value.
        `checker` - Convergence checker.
        `costRelativeTolerance` - Desired relative error in the sum of squares.
        `parRelativeTolerance` - Desired relative error in the approximate solution parameters.
        `orthoTolerance` - Desired max cosine on the orthogonality between the function vector and the columns of the Jacobian.
        `threshold` - Desired threshold for QR ranking. If the squared norm of a column vector is smaller or equal to this threshold during QR decomposition, it is considered to be a zero vector and hence the rank of the matrix is reduced.

    - #### LevenbergMarquardtOptimizer

          public LevenbergMarquardtOptimizer(double costRelativeTolerance,
                                     double parRelativeTolerance,
                                     double orthoTolerance)

      Deprecated.
      Build an optimizer for least squares problems with default values for some of the tuning parameters (see the `other contructor`. The default values for the algorithm settings are:
      - Initial step bound factor}: 100
      - QR ranking threshold}: `Precision.SAFE_MIN`
      Parameters:
        `costRelativeTolerance` - Desired relative error in the sum of squares.
        `parRelativeTolerance` - Desired relative error in the approximate solution parameters.
        `orthoTolerance` - Desired max cosine on the orthogonality between the function vector and the columns of the Jacobian.

    - #### LevenbergMarquardtOptimizer

          public LevenbergMarquardtOptimizer(double initialStepBoundFactor,
                                     double costRelativeTolerance,
                                     double parRelativeTolerance,
                                     double orthoTolerance,
                                     double threshold)

      Deprecated.
      The arguments control the behaviour of the default convergence checking procedure. Additional criteria can defined through the setting of a `ConvergenceChecker`.
      Parameters:
        `initialStepBoundFactor` - Positive input variable used in determining the initial step bound. This bound is set to the product of initialStepBoundFactor and the euclidean norm of `diag * x` if non-zero, or else to `initialStepBoundFactor` itself. In most cases factor should lie in the interval `(0.1, 100.0)`. `100` is a generally recommended value.
        `costRelativeTolerance` - Desired relative error in the sum of squares.
        `parRelativeTolerance` - Desired relative error in the approximate solution parameters.
        `orthoTolerance` - Desired max cosine on the orthogonality between the function vector and the columns of the Jacobian.
        `threshold` - Desired threshold for QR ranking. If the squared norm of a column vector is smaller or equal to this threshold during QR decomposition, it is considered to be a zero vector and hence the rank of the matrix is reduced.

  - ### Method Detail

    - #### doOptimize

          protected PointVectorValuePair doOptimize()

      Deprecated.
      Perform the bulk of the optimization algorithm.
      Specified by:
        `doOptimize` in class `BaseAbstractMultivariateVectorOptimizer<DifferentiableMultivariateVectorFunction>`
      Returns:
        the point/value pair giving the optimal value for the objective function.

    - #### determineLMParameter

          private void determineLMParameter(double[] qy,
                                  double delta,
                                  double[] diag,
                                  double[] work1,
                                  double[] work2,
                                  double[] work3)

      Deprecated.
      Determine the Levenberg-Marquardt parameter.

      This implementation is a translation in Java of the MINPACK lmpar routine.

      This method sets the lmPar and lmDir attributes.

      The authors of the original fortran function are:

      - Argonne National Laboratory. MINPACK project. March 1980
      - Burton S. Garbow
      - Kenneth E. Hillstrom
      - Jorge J. More

      Luc Maisonobe did the Java translation.

      Parameters:
        `qy` - array containing qTy
        `delta` - upper bound on the euclidean norm of diagR * lmDir
        `diag` - diagonal matrix
        `work1` - work array
        `work2` - work array
        `work3` - work array

    - #### determineLMDirection

          private void determineLMDirection(double[] qy,
                                  double[] diag,
                                  double[] lmDiag,
                                  double[] work)

      Deprecated.
      Solve a*x = b and d*x = 0 in the least squares sense.

      This implementation is a translation in Java of the MINPACK qrsolv routine.

      This method sets the lmDir and lmDiag attributes.

      The authors of the original fortran function are:

      - Argonne National Laboratory. MINPACK project. March 1980
      - Burton S. Garbow
      - Kenneth E. Hillstrom
      - Jorge J. More

      Luc Maisonobe did the Java translation.

      Parameters:
        `qy` - array containing qTy
        `diag` - diagonal matrix
        `lmDiag` - diagonal elements associated with lmDir
        `work` - work array

    - #### qrDecomposition

          private void qrDecomposition(RealMatrix jacobian)
                                throws ConvergenceException

      Deprecated.
      Decompose a matrix A as A.P = Q.R using Householder transforms.

      As suggested in the P. Lascaux and R. Theodor book Analyse numérique matricielle appliquée à l'art de l'ingénieur (Masson, 1986), instead of representing the Householder transforms with uk unit vectors such that:

           Hk = I - 2uk.ukt

      we use k non-unit vectors such that:

           Hk = I - betakvk.vkt

      where vk = ak - alphak ek. The betak coefficients are provided upon exit as recomputing them from the vk vectors would be costly.

      This decomposition handles rank deficient cases since the tranformations are performed in non-increasing columns norms order thanks to columns pivoting. The diagonal elements of the R matrix are therefore also in non-increasing absolute values order.

      Parameters:
        `jacobian` - Weighted Jacobian matrix at the current point.
      Throws:
        `ConvergenceException` - if the decomposition cannot be performed

    - #### qTy

          private void qTy(double[] y)

      Deprecated.
      Compute the product Qt.y for some Q.R. decomposition.
      Parameters:
        `y` - vector to multiply (will be overwritten with the result)

Copyright (c) 2003-2013 Apache Software Foundation