Вопрос

Я знаком с некоторыми функциями из 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' аргумент.

Не путайте его с симплексным (Данцигом) алгоритмом линейного программирования...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top