QuadraticFunction qFunc = new QuadraticFunction(optimum.getPoint());
private void outputResult() { output = new StringBuilder(); printDoubleArray("expectedPosition: ", expectedPosition); printDoubleArray("linear calculatedPosition: ", linearCalculatedPosition.toArray()); printDoubleArray("non-linear calculatedPosition: ", nonLinearOptimum.getPoint().toArray()); output.append("numberOfIterations: ").append(nonLinearOptimum.getIterations()).append("\n"); output.append("numberOfEvaluations: ").append(nonLinearOptimum.getEvaluations()).append("\n"); try { RealVector standardDeviation = nonLinearOptimum.getSigma(0); printDoubleArray("standardDeviation: ", standardDeviation.toArray()); output.append("Norm of deviation: ").append(standardDeviation.getNorm()).append("\n"); RealMatrix covarianceMatrix = nonLinearOptimum.getCovariances(0); output.append("covarianceMatrix: ").append(covarianceMatrix).append("\n"); } catch (SingularMatrixException e) { System.err.println(e.getMessage()); } System.out.println(output.toString()); }
/** * Refine an initial guess at the homography that takes the first points in * data to the second using non-linear Levenberg Marquardt optimisation. The * initial guess would normally be computed using the direct linear * transform ({@link TransformUtilities#homographyMatrixNorm(List)}). * * @param initial * the initial estimate (probably from the DLT technique) * @param data * the pairs of data points * @return the optimised estimate */ public Matrix refine(Matrix initial, List<? extends IndependentPair<? extends Point2d, ? extends Point2d>> data) { final double[] params = new double[8]; final Parameterisation p = Parameterisation.chooseOptimalParameterisation(initial, params); final LevenbergMarquardtOptimizer lm = new LevenbergMarquardtOptimizer(); final RealVector start = new ArrayRealVector(params, false); // target values are all zero as we're computing the distances ourselves final RealVector observed = new ArrayRealVector(data.size()); final int maxEvaluations = 1000; final int maxIterations = 1000; final MultivariateJacobianFunction model = getFunctions(data, p); final Optimum result = lm.optimize(LeastSquaresFactory.create(model, observed, start, null, maxEvaluations, maxIterations)); final Matrix improved = p.paramsToMatrix(result.getPoint().toArray()); // normalise MatrixUtils.times(improved, 1.0 / improved.normInf()); return improved; }
/** * Perform Levenburg-Marquardt non-linear optimisation to get better * estimates of the parameters */ private void refine() { final LevenbergMarquardtOptimizer lm = new LevenbergMarquardtOptimizer(); final RealVector start = buildInitialVector(); final RealVector observed = buildObservedVector(); final int maxEvaluations = 1000; final int maxIterations = 1000; final MultivariateVectorFunction value = new Value(); final MultivariateMatrixFunction jacobian = new Jacobian(); final MultivariateJacobianFunction model = LeastSquaresFactory.model(value, jacobian); final Optimum result = lm.optimize(LeastSquaresFactory.create(model, observed, start, null, maxEvaluations, maxIterations)); updateEstimates(result.getPoint()); }
@Override public Matrix refine(Matrix initial, List<? extends IndependentPair<? extends Point2d, ? extends Point2d>> data) { final LevenbergMarquardtOptimizer lm = new LevenbergMarquardtOptimizer(); final RealVector start = new ArrayRealVector(initial.getRowPackedCopy()); final RealVector observed = toRealVector(data); final int maxEvaluations = 1000; final int maxIterations = 1000; final MultivariateVectorFunction value = getValueFunction(data); final MultivariateMatrixFunction jacobian = getJacobianFunction(data); final MultivariateJacobianFunction model = LeastSquaresFactory.model(value, jacobian); final Optimum result = lm.optimize(LeastSquaresFactory.create(model, observed, start, null, maxEvaluations, maxIterations)); final Matrix improved = MatrixUtils.fromRowPacked(result.getPoint().toArray(), 3); MatrixUtils.times(improved, 1.0 / improved.get(2, 2)); return improved; } };
/** * Perform Levenburg-Marquardt non-linear optimisation to get better * estimates of the parameters */ private void refine() { final LevenbergMarquardtOptimizer lm = new LevenbergMarquardtOptimizer(); final RealVector start = buildInitialVector(); final RealVector observed = buildObservedVector(); final int maxEvaluations = 1000; final int maxIterations = 1000; final MultivariateVectorFunction value = new Value(); final MultivariateMatrixFunction jacobian = new Jacobian(); final MultivariateJacobianFunction model = LeastSquaresFactory.model(value, jacobian); final Optimum result = lm.optimize(LeastSquaresFactory.create(model, observed, start, null, maxEvaluations, maxIterations)); updateEstimates(result.getPoint()); }
@Override public Matrix refine(Matrix initial, List<? extends IndependentPair<? extends Point2d, ? extends Point2d>> data) { final LevenbergMarquardtOptimizer lm = new LevenbergMarquardtOptimizer(); final RealVector start = new ArrayRealVector(initial.getRowPackedCopy()); final RealVector observed = toRealVector(data, false); final int maxEvaluations = 1000; final int maxIterations = 1000; final MultivariateVectorFunction value = getValueFunction(data); final MultivariateMatrixFunction jacobian = getJacobianFunction(data); final MultivariateJacobianFunction model = LeastSquaresFactory.model(value, jacobian); final Optimum result = lm.optimize(LeastSquaresFactory.create(model, observed, start, null, maxEvaluations, maxIterations)); final Matrix improved = MatrixUtils.fromRowPacked(result.getPoint().toArray(), 3); MatrixUtils.times(improved, 1.0 / improved.get(2, 2)); return improved; } },
/** * Fits a curve. * This method computes the coefficients of the curve that best * fit the sample of observed points. * * @param points Observations. * @return the fitted parameters. */ public double[] fit(Collection<WeightedObservedPoint> points) { // Perform the fit. return getOptimizer().optimize(getProblem(points)).getPoint().toArray(); }
/** * Fits a curve. * This method computes the coefficients of the curve that best * fit the sample of observed points. * * @param points Observations. * @return the fitted parameters. */ public double[] fit(Collection<WeightedObservedPoint> points) { // Perform the fit. return getOptimizer().optimize(getProblem(points)).getPoint().toArray(); }
private void compareExpectedAndCalculatedResults() { double[] calculatedPosition = nonLinearOptimum.getPoint().toArray(); for (int i = 0; i < calculatedPosition.length; i++) { assertEquals(expectedPosition[i], calculatedPosition[i], acceptedDelta); } }
/** * Fits a curve. * This method computes the coefficients of the curve that best * fit the sample of observed points. * * @param points Observations. * @return the fitted parameters. */ public double[] fit(Collection<WeightedObservedPoint> points) { // Perform the fit. return getOptimizer().optimize(getProblem(points)).getPoint().toArray(); }