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 * https://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 18 /* 19 * This is not the original file distributed by the Apache Software Foundation 20 * It has been modified by the Hipparchus project 21 */ 22 package org.hipparchus.optim.nonlinear.vector.leastsquares; 23 24 import org.hipparchus.linear.RealMatrix; 25 import org.hipparchus.linear.RealVector; 26 import org.hipparchus.optim.OptimizationProblem; 27 28 /** 29 * The data necessary to define a non-linear least squares problem. 30 * <p> 31 * Includes the observed values, computed model function, and 32 * convergence/divergence criteria. Weights are implicit in {@link 33 * Evaluation#getResiduals()} and {@link Evaluation#getJacobian()}. 34 * </p> 35 * <p> 36 * Instances are typically either created progressively using a {@link 37 * LeastSquaresBuilder builder} or created at once using a {@link LeastSquaresFactory 38 * factory}. 39 * </p> 40 * @see LeastSquaresBuilder 41 * @see LeastSquaresFactory 42 * @see LeastSquaresAdapter 43 * 44 */ 45 public interface LeastSquaresProblem extends OptimizationProblem<LeastSquaresProblem.Evaluation> { 46 47 /** 48 * Gets the initial guess. 49 * 50 * @return the initial guess values. 51 */ 52 RealVector getStart(); 53 54 /** 55 * Get the number of observations (rows in the Jacobian) in this problem. 56 * 57 * @return the number of scalar observations 58 */ 59 int getObservationSize(); 60 61 /** 62 * Get the number of parameters (columns in the Jacobian) in this problem. 63 * 64 * @return the number of scalar parameters 65 */ 66 int getParameterSize(); 67 68 /** 69 * Evaluate the model at the specified point. 70 * 71 * 72 * @param point the parameter values. 73 * @return the model's value and derivative at the given point. 74 * @throws org.hipparchus.exception.MathIllegalStateException 75 * if the maximal number of evaluations (of the model vector function) is 76 * exceeded. 77 */ 78 Evaluation evaluate(RealVector point); 79 80 /** 81 * An evaluation of a {@link LeastSquaresProblem} at a particular point. This class 82 * also computes several quantities derived from the value and its Jacobian. 83 */ 84 interface Evaluation { 85 86 /** 87 * Get the covariance matrix of the optimized parameters. <br> Note that this 88 * operation involves the inversion of the <code>J<sup>T</sup>J</code> matrix, 89 * where {@code J} is the Jacobian matrix. The {@code threshold} parameter is a 90 * way for the caller to specify that the result of this computation should be 91 * considered meaningless, and thus trigger an exception. 92 * 93 * @param threshold Singularity threshold. 94 * @return the covariance matrix. 95 * @throws org.hipparchus.exception.MathIllegalArgumentException 96 * if the covariance matrix cannot be computed (singular problem). 97 */ 98 RealMatrix getCovariances(double threshold); 99 100 /** 101 * Get an estimate of the standard deviation of the parameters. The returned 102 * values are the square root of the diagonal coefficients of the covariance 103 * matrix, {@code sd(a[i]) ~= sqrt(C[i][i])}, where {@code a[i]} is the optimized 104 * value of the {@code i}-th parameter, and {@code C} is the covariance matrix. 105 * 106 * @param covarianceSingularityThreshold Singularity threshold (see {@link 107 * #getCovariances(double) computeCovariances}). 108 * @return an estimate of the standard deviation of the optimized parameters 109 * @throws org.hipparchus.exception.MathIllegalArgumentException 110 * if the covariance matrix cannot be computed. 111 */ 112 RealVector getSigma(double covarianceSingularityThreshold); 113 114 /** 115 * Get the normalized cost. It is the square-root of the sum of squared of 116 * the residuals, divided by the number of measurements. 117 * 118 * @return the cost. 119 */ 120 double getRMS(); 121 122 /** 123 * Get the weighted Jacobian matrix. 124 * 125 * @return the weighted Jacobian: W<sup>1/2</sup> J. 126 * @throws org.hipparchus.exception.MathIllegalArgumentException 127 * if the Jacobian dimension does not match problem dimension. 128 */ 129 RealMatrix getJacobian(); 130 131 /** 132 * Get the cost. 133 * It is the square-root of the {@link #getChiSquare() objective function}. 134 * 135 * @return the cost. 136 * @see #getResiduals() 137 * @see #getChiSquare() 138 */ 139 double getCost(); 140 141 /** 142 * Get the sum of the squares of the residuals. 143 * 144 * @return the cost. 145 * @see #getResiduals() 146 * @see #getCost() 147 */ 148 double getChiSquare(); 149 150 /** 151 * Get the reduced chi-square. 152 * 153 * @param n Number of fitted parameters. 154 * @return the sum of the squares of the residuals divided by the number 155 * of degrees of freedom. 156 */ 157 double getReducedChiSquare(int n); 158 159 /** 160 * Get the weighted residuals. The residual is the difference between the 161 * observed (target) values and the model (objective function) value. There is one 162 * residual for each element of the vector-valued function. The raw residuals are 163 * then multiplied by the square root of the weight matrix. 164 * 165 * @return the weighted residuals: W<sup>1/2</sup> K. 166 * @throws org.hipparchus.exception.MathIllegalArgumentException 167 * if the residuals have the wrong length. 168 */ 169 RealVector getResiduals(); 170 171 /** 172 * Get the abscissa (independent variables) of this evaluation. 173 * 174 * @return the point provided to {@link #evaluate(RealVector)}. 175 */ 176 RealVector getPoint(); 177 } 178 }