Минимизация функции Python без производной
-
09-12-2019 - |
Вопрос
Я знаком с некоторыми функциями из scipy.optimize.optimize и раньше использовал fmin_cg для минимизации функции, производную которой я знал.Однако теперь у меня есть формула, которую нелегко дифференцировать.
Некоторые функции в этом модуле (например, fmin_cg) фактически не требуют предоставления производной.Я предполагаю, что затем они вычисляют квазипроизводную, по очереди добавляя небольшое значение к каждому из параметров - это правильно?
Мой главный вопрос заключается в следующем:Какую из функций (или одну из других источников) лучше всего использовать при минимизации функции по нескольким параметрам без заданной производной?
Решение
Да, позвонив в любой из fmin_bfgs fmin_cg fmin_powell
как
fmin_xx( func, x0, fprime=None, epsilon=.001 ... )
оценивает градиент в x
к (func( x + epsilon I ) - func(x)) / epsilon
.
Это «лучшее» для вашего приложения, тем не менее, сильно зависит от того, насколько гладко ваша функция и сколько переменных.
Равнинный Нелдер-Мид, fmin
, — хороший первый выбор — медленно, но верно;к сожалению, хитрый Нелдер-Мид начинается с симплекса фиксированного размера, 0,05/00025, независимо от масштаба x.
я это слышал fmin_tnc
в scipy.optimize.tnc
хороший:
fmin_tnc( func, x0, approx_grad=True, epsilon=.001 ... ) or
fmin_tnc( func_and_grad, x0 ... ) # func, your own estimated gradient
(fmin_tnc — это ~ fmin_ncg со связанными ограничениями, хорошими сообщениями, позволяющими увидеть, что происходит, несколько другими аргументами.)
Другие советы
Я не слишком знаком с тем, что доступно в SciPy, но Скоростной спуск симплекс Метод (он же Нелдера-Мида или метод Амебы) часто хорошо работает для многомерной оптимизации.
Глядя сейчас на скучная документация, похоже, он доступен в качестве опции в minimize()
функция с использованием method='Nelder-Mead'
аргумент.
Не путайте его с симплексным (Данцигом) алгоритмом линейного программирования...