#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, но я не уверен, что понимаю, как я мог бы этого достичь.
Чего я не понимаю, как это сделать, так это:
- Как передать ограничения для a, b и c отдельно (скажем, a должен находиться в пределах [-1, 0], b должен находиться в пределах [0, 1] и т. Д.)
- Как убедиться, что 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
аргумент.