使用scipy进行错误优化(最大化)

时间:2017-11-03 16:45:39

标签: python function numpy optimization scipy

我正在尝试使用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

1 个答案:

答案 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和其他参数向量的元素减法,但这样做的事情会更好一些。