Нужны ли ftol и gtol в scipy.optimize.minimize, правильно ли давать очень низкое значение? - PullRequest
0 голосов
/ 04 февраля 2020

Я использую BFGS-оптимизатор с ограниченной памятью, чтобы минимизировать значение функции черного ящика. Я симулировал случайным образом множество комбинаций входных параметров и понял, что параметр ftol и gtol только мешает, и он не способствует уменьшению значения моей функции (существует положительная корреляция между выходами и случайные значения для ftol и gtol, поэтому чем меньше, тем лучше). Поэтому я установил оба параметра на 1E-18 и сконцентрировался на настройке других параметров, таким образом, выходное сообщение CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH означает, что вся оптимизация зависела от правильного значения для eps Я думаю.

Затем я установил оба ftol и gtol до 1E-20, чтобы не мешать, но потом я начал получать неоптимальные результаты.

Итак, мой оптимизатор:

scipy.optimize.minimize(function, x0=guess.flatten(), method='L-BFGS-B', bounds=bounds, options={ 'maxcor': maxcor, 'ftol': 1E-20, 'gtol': 1E-20, 'eps': eps, 'maxfun': maxrounds, 'maxiter': maxrounds, 'maxls': maxls})

Поэтому я установил его на 1E-20, а остальные значения подаются случайным образом. Средний выход для большей выборки меньше с 1E-20, чем с 1E-18, я не понимаю, почему, они должны быть очень маленькими числами, которые незначительны. Я также начал получать сообщения о выходе, такие как CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL, которые я не знаю, как это было возможно для такой небольшой толерантности. Поэтому у меня есть следующие вопросы:

1) Стоит ли устанавливать ftol и gtol на такие низкие значения, как 1E-20?

2) Должен ли я установить tol (значение внешнего допуска), если ftol и gtol уже установлены? Я не хочу, чтобы это вышло раньше времени. Или tol в качестве порога выхода отключается, если включены gtol и ftol?

3) Возможно ли, что сам Сципи, Numpy или Python3 не может обработать плавающую точку значения с 20 десятичными знаками. Я заметил, что Python в основном печатает 18 цифр для чисел с плавающей запятой, поэтому проблема может быть в том, что я поставил слишком много цифр. Если так, то каково максимальное количество цифр, обрабатываемых scipy.optimize? (Scipy v1.4.1 | Numpy v1.18.1 | Python 3.5.3)

1 Ответ

0 голосов
/ 08 февраля 2020

Допустимое отклонение на самом деле недостижимо из-за ошибок округления. Вы можете прочитать здесь подробнее о точности с плавающей запятой в Python. Вы должны выбрать небольшое, но разумное число для gtol и ftol, обычно 1e-6 - 1e-8 работ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...