使用 scipy 的微分进化改变多个参数

Varying over multiple parameters with scipy's differential evolution

我正在使用 Scipy 的内置差分进化找到 Python 中参数 nu 的函数 f 的最大值,同时保持其他项 (args) 固定。我的代码

max = scipy.optimize.differential_evolution(lambda nu:-f(args,nu),bounds)
 
fopt = max.fun

给我想要的正确值。但是,现在我想做同样的事情,但要改变两个参数;称他们为 nu 和 mu。我试过了

max = scipy.optimize.differential_evolution(lambda nu,mu:-f(args,nu,mu),bounds)

fopt = max.fun

但是我得到一个错误。使用上述方法对多个参数进行优化的正确方法是什么?

您可以通过将多个参数作为列表传递给 scipy.optimize.differential_evolution 来优化它们。例如,假设以下函数将列表 x 作为参数:

def fun(x):
    return x[0] + x[1]

假设第一个参数是nu(对应x[0]),第二个参数是mu(对应x[1])。相应地为 numu 定义边界,然后您可以同时优化两者:

from scipy.optimize import differential_evolution

bounds = [(0,2), (0,3)] # for e.g., (0,2) for nu and (0,3) for mu
max = differential_evolution(fun, bounds)
fopt = max.fun

使用lambda:

from scipy.optimize import differential_evolution

fun = lambda x: x[0]+x[1]
bounds = [(0,2), (0,3)] # for e.g., (0,2) for nu and (0,3) for mu
max = differential_evolution(fun, bounds)
fopt = max.fun

在您的特定情况下,您的 lambda 函数 lambda nu,mu:-f(args,nu,mu) 返回函数 f 的负值。在这里,您可以将列表 x 中的 numu 作为 lambda x:-f(args,x) 传递,并在 f 中将 x 解压为 numu分别.