Метод Scipy Optimization TN C, что делает масштаб? решение "не может прогрессировать"? - PullRequest
0 голосов
/ 21 марта 2020

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

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

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

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

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

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

1 Ответ

0 голосов
/ 22 марта 2020

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

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

...