首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有两个变量和插值函数的optimize.minimize

使用带有两个变量和插值函数的optimize.minimize
EN

Stack Overflow用户
提问于 2016-05-30 09:22:33
回答 2查看 6.1K关注 0票数 2

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

代码语言:javascript
复制
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)的范围内,全球最大值是多少。插补效果很好。但到目前为止,找出全球最大值并不有效。

插补

代码语言:javascript
复制
 self.F2 = interp2d(xx, -yy, z, kind, bounds_error=False)

收益率

代码语言:javascript
复制
<scipy.interpolate.interpolate.interp2d object at 0x0000000002C3BBE0>

我试着优化via:

代码语言:javascript
复制
x0 = [(2000,3500),(10,50)]
res = scipy.optimize.minimize(self.F2, x0, method='Nelder-Mead')

引发异常:

代码语言:javascript
复制
TypeError: __call__() missing 1 required positional argument: 'y'

我认为优化器不能通过插值处理对象。在示例中,人们使用lambda从函数中获取值。在我的案子里我该怎么做?

最好,亚历克斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-30 10:10:35

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

代码语言:javascript
复制
F2 = interp2d(x, y, -z)

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

代码语言:javascript
复制
f = lambda x: F2(*x)

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

代码语言:javascript
复制
x0 = (2200, 12)
bounds = [(2000,3500),(10,50)]
print minimize(f, x0, method='SLSQP', bounds=bounds)

这产生了:

代码语言:javascript
复制
  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
票数 4
EN

Stack Overflow用户

发布于 2020-07-24 12:00:29

还有一个可能的解决方案(希望你有了这个想法):

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

代码语言:javascript
复制
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函数实现,但没有成功。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37522050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档