1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.math4.legacy.fitting.leastsquares; 18 19 import org.apache.commons.math4.legacy.linear.RealMatrix; 20 import org.apache.commons.math4.legacy.linear.RealVector; 21 import org.apache.commons.math4.legacy.optim.OptimizationProblem; 22 23 /** 24 * The data necessary to define a non-linear least squares problem. 25 * <p> 26 * Includes the observed values, computed model function, and 27 * convergence/divergence criteria. Weights are implicit in {@link 28 * Evaluation#getResiduals()} and {@link Evaluation#getJacobian()}. 29 * </p> 30 * <p> 31 * Instances are typically either created progressively using a {@link 32 * LeastSquaresBuilder builder} or created at once using a {@link LeastSquaresFactory 33 * factory}. 34 * </p> 35 * @see LeastSquaresBuilder 36 * @see LeastSquaresFactory 37 * @see LeastSquaresAdapter 38 * 39 * @since 3.3 40 */ 41 public interface LeastSquaresProblem extends OptimizationProblem<LeastSquaresProblem.Evaluation> { 42 43 /** 44 * Gets the initial guess. 45 * 46 * @return the initial guess values. 47 */ 48 RealVector getStart(); 49 50 /** 51 * Get the number of observations (rows in the Jacobian) in this problem. 52 * 53 * @return the number of scalar observations 54 */ 55 int getObservationSize(); 56 57 /** 58 * Get the number of parameters (columns in the Jacobian) in this problem. 59 * 60 * @return the number of scalar parameters 61 */ 62 int getParameterSize(); 63 64 /** 65 * Evaluate the model at the specified point. 66 * 67 * 68 * @param point the parameter values. 69 * @return the model's value and derivative at the given point. 70 * @throws org.apache.commons.math4.legacy.exception.TooManyEvaluationsException 71 * if the maximal number of evaluations (of the model vector function) is 72 * exceeded. 73 */ 74 Evaluation evaluate(RealVector point); 75 76 /** 77 * An evaluation of a {@link LeastSquaresProblem} at a particular point. This class 78 * also computes several quantities derived from the value and its Jacobian. 79 */ 80 interface Evaluation { 81 82 /** 83 * Get the covariance matrix of the optimized parameters. <br> Note that this 84 * operation involves the inversion of the <code>J<sup>T</sup>J</code> matrix, 85 * where {@code J} is the Jacobian matrix. The {@code threshold} parameter is a 86 * way for the caller to specify that the result of this computation should be 87 * considered meaningless, and thus trigger an exception. 88 * 89 * @param threshold Singularity threshold. 90 * @return the covariance matrix. 91 * @throws org.apache.commons.math4.legacy.linear.SingularMatrixException 92 * if the covariance matrix cannot be computed (singular problem). 93 */ 94 RealMatrix getCovariances(double threshold); 95 96 /** 97 * Get an estimate of the standard deviation of the parameters. The returned 98 * values are the square root of the diagonal coefficients of the covariance 99 * matrix, {@code sd(a[i]) ~= sqrt(C[i][i])}, where {@code a[i]} is the optimized 100 * value of the {@code i}-th parameter, and {@code C} is the covariance matrix. 101 * 102 * @param covarianceSingularityThreshold Singularity threshold (see {@link 103 * #getCovariances(double) computeCovariances}). 104 * @return an estimate of the standard deviation of the optimized parameters 105 * @throws org.apache.commons.math4.legacy.linear.SingularMatrixException 106 * if the covariance matrix cannot be computed. 107 */ 108 RealVector getSigma(double covarianceSingularityThreshold); 109 110 /** 111 * Get the normalized cost. It is the square-root of the sum of squared of 112 * the residuals, divided by the number of measurements. 113 * 114 * @return the cost. 115 */ 116 double getRMS(); 117 118 /** 119 * Get the weighted Jacobian matrix. 120 * 121 * @return the weighted Jacobian: W<sup>1/2</sup> J. 122 * @throws org.apache.commons.math4.legacy.exception.DimensionMismatchException 123 * if the Jacobian dimension does not match problem dimension. 124 */ 125 RealMatrix getJacobian(); 126 127 /** 128 * Get the cost. 129 * It is the square-root of the {@link #getChiSquare() objective function}. 130 * 131 * @return the cost. 132 * @see #getResiduals() 133 * @see #getChiSquare() 134 */ 135 double getCost(); 136 137 /** 138 * Get the sum of the squares of the residuals. 139 * 140 * @return the cost. 141 * @see #getResiduals() 142 * @see #getCost() 143 */ 144 double getChiSquare(); 145 146 /** 147 * Get the reduced chi-square. 148 * 149 * @param n Number of fitted parameters. 150 * @return the sum of the squares of the residuals divided by the number 151 * of degrees of freedom. 152 */ 153 double getReducedChiSquare(int n); 154 155 /** 156 * Get the weighted residuals. The residual is the difference between the 157 * observed (target) values and the model (objective function) value. There is one 158 * residual for each element of the vector-valued function. The raw residuals are 159 * then multiplied by the square root of the weight matrix. 160 * 161 * @return the weighted residuals: W<sup>1/2</sup> K. 162 * @throws org.apache.commons.math4.legacy.exception.DimensionMismatchException 163 * if the residuals have the wrong length. 164 */ 165 RealVector getResiduals(); 166 167 /** 168 * Get the abscissa (independent variables) of this evaluation. 169 * 170 * @return the point provided to {@link #evaluate(RealVector)}. 171 */ 172 RealVector getPoint(); 173 } 174 }