【问题标题】:Scipy maximization by changing only some parameters通过仅更改某些参数来最大化 Scipy
【发布时间】:2021-06-18 12:45:54
【问题描述】:

我有一个函数,它接受多个输入参数并返回一个结果

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。李>

【问题讨论】:

    标签: python scipy scipy-optimize scipy-optimize-minimize


    【解决方案1】:

    To 2:您可以简单地创建一个只有三个参数的新目标函数。一个简单的方法是使用 lambda 函数:

    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的定义中的额外减号。

    To 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-BTNC,因此您必须使用method 参数选择正确的优化器。

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-11-22
      • 2020-03-08
      • 2015-04-09
      • 1970-01-01
      相关资源
      最近更新 更多