Как получить последнее лучшее предположение от LeastSquareOptimizer? - PullRequest
0 голосов
/ 13 июня 2019

Есть ли способ получить последнее предположение о 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 голосов
/ 16 июня 2019

Возможно, есть лучший способ, но как насчет сохранения лучшего предположения вручную?Оптимизатор вызывает 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;
    }
}

Боюсь, данные изменчивы, поэтому выМне нужно его клонировать, чтобы он не перезаписывался.


Возможно, я ошибаюсь, поскольку у меня нет опыта работы с этой библиотекой.

...