Python 使用带2个变量和插值函数的optimize.minimize from scipy
我没有找到使用多维函数从scipy执行optimize.minimize的方法。在几乎所有的例子中,当我的函数被插值时,分析函数被优化。测试数据集如下所示:Python 使用带2个变量和插值函数的optimize.minimize from scipy,python,numpy,optimization,scipy,Python,Numpy,Optimization,Scipy,我没有找到使用多维函数从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 我想知
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>
将引发异常:
TypeError: __call__() missing 1 required positional argument: 'y'
我认为优化器无法处理插值中的对象。在示例中,人们使用lambda从函数中获取值。我该怎么办
最好的,
Alex首先,要找到全局最大值(而不是最小值),需要用相反的符号插值函数:
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函数实现,但没有成功。感谢您的帮助和评论!现在很好用!
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]