2015-05-28 2 views
0

Я пытаюсь оптимизировать функцию небольшого числа переменных (от 2 до 10). То, что я пытаюсь сделать, это вычислить минимум функции на ограниченном гиперкубаОграниченная оптимизация с использованием матрицы Гессиана (scipy)

[0,1] x [0,1] x ... x [0,1]

Расчет функции, ее градиент и его мешковину аль относительно простым, быстрым и точным.

Теперь моя проблема заключается в следующем:

Использование scipy, я могу использовать либо scipy.optimize.minimize(..., method='Newton-CG') или scipy.optimize.minimize(..., method='TNC') для вычисления минимума функции, однако:

  • Первый метод использует матрицу Гессе, но Я не могу установить границы для переменных, которые я оптимизирую
  • Второй метод позволяет мне устанавливать границы для переменных, но метод не использует гессиан.

Есть ли какой-либо метод, который будет использовать оба?

+1

Почему якобиан недостаточно в вашем случае? – Moritz

+0

Вы можете попробовать cyipopt – Moritz

+0

@Moritz хорошо, как правило, использование hessian ускорит работу и уменьшит количество оценок funcion. – 5xum

ответ

1

Вот несколько альтернатив:

Mystic, основа, которая позволяет оптимизировать ограничение с помощью внешних ограничений (я думаю, множители Лагранжа). Пакет использует scipy.optimize, поэтому должно быть возможно использовать методы Scipy с дополнительными ограничениями.

Ipopt и его привязки к питону PyIpopt и CyIpopt. Вы можете посмотреть openopt.

Обычно разработанный для подгонки кривой, lmfit обеспечивает возможность добавления внешних ограничений. Он имеет большинство решателей из scipy включены.

+0

lmfit, вероятно, проще всего начать. – Moritz

1

l-bfgs-b делает ограниченную оптимизацию. Как и любой квази-ньютоновский метод, он приближается к гессианскому. Но это часто лучше, чем использование реального гессиана.

Смежные вопросы