如何从LeastSquareOptimizer获得最后的最佳猜测?

时间:2019-06-13 16:52:22

标签: java optimization least-squares apache-commons-math

是否有办法获得LeastSquaresOptimizer的最新猜测?

我正在使用Apache Commons Math进行最小二乘优化。为此,我必须提供一个 maxEvaluations() maxIterations()值。问题是,如果优化在达到最大评估次数或迭代次数之前未收敛,则会返回org.apache.commons.math4.exception.TooManyIterationsException: illegal state: maximal count (6,000) exceeded: iterations。如果发生这种情况,我想看看优化器的最后最佳猜测是什么。我该怎么做?

LeastSquaresProblem problem = new LeastSquaresBuilder()
                                     .start(new double[]{0,0,0,1,1,1,0,0,0})
                                     .model(costFunc)
                                     .target(gravity)
                                     .lazyEvaluation(false)
                                     .maxEvaluations(150000)
                                     .maxIterations(6000)
                                     .build();

LeastSquaresOptimizer.Optimum optimum;
try {
    optimum = new LevenbergMarquardtOptimizer()
                      .withCostRelativeTolerance(1.0e-10)
                      .optimize(problem);
} catch (Exception e) {
    throw new Exception(e);
} 

1 个答案:

答案 0 :(得分:0)

也许有更好的方法,但是手动存储最佳猜测呢?优化器反复调用problem::evaluate(RealVector point)。当您用自己的函数替换它时,您将获得输入和输出。

这种替换使用起来应该很简单

LeastSquaresProblem wrappedProblem = new LeastSquaresAdapter(problem) {
    @Override public LeastSquaresProblem.Evaluation evaluate(RealVector point) {
        LeastSquaresProblem.Evaluation result = super(point);
        ... store the point and the result, if it's an improvement
        return result;
    }
}

恐怕数据是可变的,因此您需要对其进行克隆,以免覆盖。


由于我没有使用该库的经验,所以我可能是错的。