【问题标题】:Wrong optimization with scipy (maximize)使用 scipy 进行错误优化(最大化)
【发布时间】:2018-04-16 11:24:31
【问题描述】:

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

【问题讨论】:

  • 您不要在f 中使用sign。是故意的吗?
  • 那我应该在哪里使用呢?
  • 乘以你返回的总和
  • [0, 0, 0] is 如果你正在做一个最小化(你是)正确的解决方案。 old 是一个常数,因此将找到firstsecondthird 的下限的最小值,它们都为零。我认为@AndreySobolev 是对的,您的意思是将f 的返回值乘以-1。
  • 由于某些原因,我认为它是直接被optimize.minimize使用的。乘以返回值确实有意义! (捂脸)

标签: python function numpy optimization scipy


【解决方案1】:

通常在执行非线性优化时,像您的函数这样的库仅采用单个参数向量。一个好主意,一般来说,如果你想最大化一个函数是最小化它的逆。如果你只是想最大化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 和其他参数向量进行元素减法,但这样会更好一些。

【讨论】:

  • 感谢您的回答。我很难看到使用部分的优势。仅仅是“风格”的原因(干净的代码)吗?
  • @Lazza87 许多这些算法都是在 C/C++/Fortran 中实现的。如果您使用外部变量,优化器将不得不不断地在 C 和 Python 之间走动,这是一个缓慢的过程,才能访问它们。如果您预先将它们作为局部函数变量或部分对象的一部分提供,您的优化将运行得更快。分布式计算也有优势,因为您可以腌制 Partial,但您将成为 SOL 与全局。
  • @Lazza87 您可能还更喜欢 mystic 包(在 PyPI 上)进行约束优化,它的设置对于更复杂的约束要好一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多