【问题标题】:Varying over multiple parameters with scipy's differential evolution使用 scipy 的差分进化改变多个参数
【发布时间】:2022-02-04 23:32:27
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: python optimization scipy differential-evolution


    【解决方案1】:

    您可以通过将多个参数作为列表传递给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

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2015-11-24
      • 2021-02-03
      • 2014-10-02
      • 2018-08-24
      • 2019-05-29
      相关资源
      最近更新 更多