使用优化.最小化从 scipy 与 2 变量和插值函数



我没有找到一种方法来执行优化。在几乎所有的例子中,分析函数都经过优化,而我的函数是插值的。测试数据集如下所示:

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 从他们的函数中获取值。在我的情况下,我必须做什么?

最好亚历克斯

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

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

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

再创建一个函数 (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 函数实现,但没有运气。

最新更新