我正在尝试使用scipy.optimize来确定3个参数(变量)的最佳值。我从一个非常简单的优化函数开始,该函数将分析的参数与一些预定义(过去)值相加。使用某些固定值绑定值。当我处理最大化问题时,我将sign
参数的值设置为-1
。但是,scipy会将[0, 0, 0]
作为最佳值返回(与设置sign=1
相同),而正确的解决方案是[2, 2, 2]
。我设置错了吗?我错过了什么?
import scipy.optimize as optimize
import numpy as np
old = [1,1,1]
def f(params,sign=-1.0):
first, second, third = params
return sum(old+[first, second, third])
initial_guess = [2,2,2]
in1 = 1
in2 = 2
in3 = 1
bnds = ((0, in1+2), (0, in2+2), (0, in3+2))
result = optimize.minimize(f, initial_guess, bounds=bnds)
print result.x
答案 0 :(得分:0)
通常,在执行非线性优化时,像您的函数这样的库只采用单个参数向量。一般来说,一个好主意,如果你想最大化一个函数是最小化它的逆。如果你只想最大化x1+x2+x3
的价值,我会用这种方式写出来:
from scipy.optimize import minimize
def f(x):
return 1/sum(x)
guess = [2,2,2]
x1bnds = (0, 3)
x2bnds = (0, 4)
x3bnds = (0, 5)
bnds = (x1bnds, x2bnds, x3bnds)
result = minimize(f, guess, bounds=bnds)
print(result.x)
将为您提供[3,4,5]
,因为优化程序会达到界限。
如果你想操作输入参数和其他一些值之间的距离,我会修改设置:
from functools import partial
from scipy.optimize import minimize
import numpy as np
other_values = np.asarray([3,4,5])
def f(x, other_pts):
x_lcl = np.asarray(x)
difference = x_lcl-other_pts
return 1/difference.sum()
guess = [2,2,2]
x1bnds = (0, 3)
x2bnds = (0, 4)
x3bnds = (0, 5)
bnds = (x1bnds, x2bnds, x3bnds)
f_opt = partial(f, other_values)
result = minimize(f_opt, guess, bounds=bnds)
print(result.x)
将为您提供[0,0,0]
,因为优化程序会达到界限。
最好让你优化的函数不依赖于外部数据(全局变量) - 使用partial
会使一切变得更好。
如果你不想使用numpy,你可以使用列表推导来进行x和其他参数向量的元素减法,但这样做的事情会更好一些。