Метод Scipy Optimization TNC, что делает шкала? решение не в состоянии прогрессировать?

Я запускаю несколько ограниченных оптимизаций с известным градиентом (от 100 до 300 переменных). Иногда TNC возвращается «не в состоянии прогрессировать».

Для моей целевой функции L-BFGS-B намного медленнее и выдает плохие результаты по сравнению с TNC. (Возможно, потому что TNC лучше, когда число переменных велико) Используя Basinhopping с L-BFGS-B и niter_success до 10, я получаю результаты, близкие к TNC, но со скоростью в 20 раз ниже. Когда TNC возвращает «невозможно выполнить», «L-BFGS-B» возвращает лучшие результаты. Итак, мое текущее решение состоит в том, чтобы запускать Basinhopping, когда TNC выходит из строя со статусом 6 - «невозможно выполнить».

Кажется, что «невозможно прогрессировать» возвращается, когда TNC не может уменьшить целевую функцию за x число итераций. Я немного поиграл с коэффициентом масштабирования и непоследовательно получил лучшие результаты.

Насколько мне известно, масштабирование в задаче оптимизации позволяет оптимизатору узнать, какая переменная более эффективна. У меня есть эта информация, и я считаю, что это уменьшит количество «неспособных к прогрессу», которые я получаю. Согласно документам, https://docs.scipy.org/doc/scipy/reference/optimize.minimize-tnc.html "Масштаб шкалы по умолчанию восходящий-нижний для переменных, ограниченных интервалом, и 1+|x] для остальных". Таким образом, это верхняя граница - нижняя граница для переменных, которые ограничены, не в состоянии понять, как обрабатываются неограниченные. что такое 1+|x]?

Кроме того, я вручную рассчитал up-low и установил unbounded равным 1, это возвращает разные результаты каждый раз, когда я запускаю оптимизацию с одним и тем же вводом. (Странно?)

Я также попытался заглянуть в код, как TNC обрабатывает масштаб, обертка spicy отправляет пустой массив или входной массив в код C https://github.com/scipy/scipy/blob/master/scipy/optimize/tnc/moduleTNC.c. В коде C я не могу найти, где создается массив масштаба или как он используется. Также не удалось найти, когда срабатывает «невозможно прогрессировать». Может ли кто-нибудь указать мне, где я должен искать?


person Rudra Roy    schedule 21.03.2020    source источник


Ответы (1)


Я разрешил «невозможно прогрессировать», выброшенный TNC, путем масштабирования ввода. Если вы столкнулись с этой проблемой, сформируйте вектор масштаба, если вы знаете, какие переменные эффективно минимизируют целевую функцию.

Скажем, X1 более эффективен, чем X2, тогда ваш масштабный вектор будет [100,2]. Используйте это, чтобы изменить границы, входные данные и результат (res.x).

person Rudra Roy    schedule 22.03.2020