【问题标题】:Use optimize.minimize from scipy with 2 variables and interpolated function使用带有 2 个变量和插值函数的 scipy 中的 optimize.minimize
【发布时间】:2016-09-28 01:41:03
【问题描述】:

我没有找到使用多维函数从 scipy 执行 optimize.minimize 的方法。在几乎所有示例中,分析函数都被优化,而我的函数被插值。测试数据集如下所示:

x = np.array([2000,2500,3000,3500])
y = np.array([10,15,25,50])
z = np.array([10,12,17,19,13,13,16,20,17,60,25,25,8,35,15,20])
data = np.array([x,y,z])

虽然函数就像 F(x,y) = z

我想知道在 f(2200,12) 处会发生什么,以及 x (2000:3500) 和 y (10:50) 范围内的全局最大值是多少。插值工作正常。但到目前为止,找到全局最大值还没有用。

插值

 self.F2 = interp2d(xx, -yy, z, kind, bounds_error=False)

产量

<scipy.interpolate.interpolate.interp2d object at 0x0000000002C3BBE0>

我尝试通过以下方式进行优化:

x0 = [(2000,3500),(10,50)]
res = scipy.optimize.minimize(self.F2, x0, method='Nelder-Mead')

抛出异常:

TypeError: __call__() missing 1 required positional argument: 'y'

我认为优化器无法处理插值中的对象。在示例中,人们使用 lambda 从他们的函数中获取值。我该怎么办?

最好, 亚历克斯

【问题讨论】:

    标签: python numpy optimization scipy


    【解决方案1】:

    另一种可能的解决方案(希望你明白):

    又创建了一个函数 (f),并将最小化的值作为参数发送给该函数。

    from scipy.optimize import minimize
    
    x = data.Height.values
    y = data.Weight.values
    
    def f(params):
        w0, w1 = params
        return mse(w0, w1, x, y)
    
    optimum = minimize(f, (0,0), method = 'L-BFGS-B', bounds = ((-100, 100), (-5,5)) )
    w0 = optimum.x[0]
    w1 = optimum.x[1]
    

    也尝试使用 lambda 函数实现,但没有成功。

    【讨论】:

      【解决方案2】:

      首先,要找到全局最大值(而不是最小值),您需要用相反的符号对函数进行插值:

      F2 = interp2d(x, y, -z)
      

      其次,minimize 中的可调用对象接受参数元组,interp2d 对象需要输入坐标作为单独的位置参数。因此,我们不能直接在minimize 中使用interp2d 对象;我们需要一个包装器,它会从minimize 解压一组参数并将其提供给interp2d

      f = lambda x: F2(*x)
      

      第三,要使用minimize,您需要指定最小值的初始猜测(和边界,在您的情况下)。任何合理的观点都可以:

      x0 = (2200, 12)
      bounds = [(2000,3500),(10,50)]
      print minimize(f, x0, method='SLSQP', bounds=bounds)
      

      这会产生:

        status: 0
       success: True
          njev: 43
          nfev: 243
           fun: array([-59.99999488])
             x: array([ 2500.00002708,    24.99999931])
       message: 'Optimization terminated successfully.'
           jac: array([ 0.07000017,  1.        ,  0.        ])
           nit: 43
      

      【讨论】:

      • 感谢您的帮助和cmets!现在可以正常使用了!
      猜你喜欢
      • 2020-07-14
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多