Минимизация функции Python без производной - PullRequest
1 голос
/ 08 марта 2012

Я знаком с некоторыми функциями из scipy.optimize.optimize и в прошлом использовал fmin_cg, чтобы минимизировать функцию, в которой я знал производную. Однако теперь у меня есть формула, которую нелегко дифференцировать.

Некоторые функции в этом модуле (например, fmin_cg) фактически не требуют предоставления производной. Я предполагаю, что они затем вычисляют квази-производную, добавляя небольшое значение к каждому из параметров по очереди - это правильно?

Мой главный вопрос заключается в следующем: какую из функций (или одну из других) лучше всего использовать при минимизации функции по нескольким параметрам без заданной производной?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Да, вызов любого из fmin_bfgs fmin_cg fmin_powell как

fmin_xx( func, x0, fprime=None, epsilon=.001 ... )

оценивает градиент на x на (func( x + epsilon I ) - func(x)) / epsilon.
Что «лучше» для вашего приложения, хотя сильно зависит отнасколько гладкая ваша функция и сколько переменных.
Обычный Nelder-Mead, fmin, хороший выбор - медленно, но верно;к сожалению, скучный Nelder-Mead начинается с симплекса фиксированного размера, .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 со связанными ограничениями, приятные сообщения о том, что происходит, несколько иные аргументы.)

3 голосов
/ 08 марта 2012

Я не слишком знаком с тем, что доступно в SciPy, но метод Downhill Simplex (он же Nelder-Mead или метод Amoeba) часто хорошо работает для многомерной оптимизации.

Глядя на документацию scipy , похоже, что она доступна в качестве опции в функции minimize() с использованием аргумента method='Nelder-Mead'.

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

...