Максимизация Scipy за счет изменения только некоторых параметров

#python #scipy #scipy-optimize #scipy-optimize-minimize

Вопрос:

У меня есть функция, которая принимает несколько входных параметров и возвращает один результат

 def objective(a, b, c, d, e, f):
...
return result
 

Я хотел бы найти значения a, b и c в определенных диапазонах, которые максимизируют результат, сохраняя при этом d, e и f постоянными.

Я просматривал, чтобы понять, как работает scipy.optimize.minimize, но я не уверен, что понимаю, как я мог бы этого достичь.

Чего я не понимаю, как это сделать, так это:

  1. Как передать ограничения для a, b и c отдельно (скажем, a должен находиться в пределах [-1, 0], b должен находиться в пределах [0, 1] и т. Д.)
  2. Как убедиться, что d, e и f являются экзогенными для упражнения по максимизации (т. Е. Они не сгибаются) — и, я полагаю, наоборот, как указать функции минимизации, чтобы они сгибали a, b и c.

Ответ №1:

К 2: Вы можете просто создать новую целевую функцию, которая имеет только три параметра. Простой способ сделать это-использовать лямбда-функции:

 d = ...
e = ...
f = ...
myNewObjective = lambda a, b, c: -objective(a, b, c, d, e, f)
scipy.optimize.minimize(objective, [0, 0, 0], method = 'L-BFGS-B')
 

Поскольку вы хотите максимизировать свою цель и scipy поддерживаете только минимизацию , вы должны минимизировать -objective , следовательно, дополнительный минус в определении myNewObjective .

К 1: Вы можете передавать scipy.optimize.Bounds объекты некоторым функциям оптимизатора, например

 bounds = scipy.optimize.Bounds([-1.0, 0.0, 0.0], [0.0, 1.0, 1.0])
scipy.optimize.minimize(myNewObjective, x0, bounds = bounds, method = 'L-BFGS-B')
 

Вам просто нужно пройти нижнюю и верхнюю границы при построении границ. Пожалуйста, обратите внимание, что только некоторые типы оптимизаторов действительно могут справляться с такого рода ограничениями, например L-BFGS-B , или TNC поэтому вы должны выбрать правильный оптимизатор, используя method аргумент.