【发布时间】:2018-09-07 20:57:33
【问题描述】:
我正在尝试将scipy.optimize.minimize 与简单的a <= x <= b 界限一起使用。但是,经常发生我的目标函数在边界之外进行评估。据我了解,这发生在minimize 试图确定边界处目标函数的梯度时。
小例子:
import math
import numpy as np
from scipy.optimize import Bounds, minimize
constraint = Bounds([-1, -1], [1, 1], True)
def fun(x):
print(x)
return -math.exp(-np.dot(x,x))
result = minimize(fun, [-1, -1], bounds=constraint)
输出显示最小化器跳转到点[1,1],然后尝试在[1.00000001, 1]处求值:
[-1. -1.]
[-0.99999999 -1. ]
[-1. -0.99999999]
[-0.72932943 -0.72932943]
[-0.72932942 -0.72932943]
[-0.72932943 -0.72932942]
[-0.22590689 -0.22590689]
[-0.22590688 -0.22590689]
[-0.22590689 -0.22590688]
[1. 1.]
[1.00000001 1. ]
[1. 1.00000001]
[-0.03437328 -0.03437328]
...
当然,在这个例子中没有问题,因为fun 也可以在那里计算。但情况可能并非总是如此......
在我的实际问题中,最小值不能在边界上,我有一个简单的解决方法,即在边界上添加一个 epsilon。 但是人们会期望应该有一个简单的解决方案来解决这个问题,如果最小值可以在边界处也可以工作?
PS:如果我是第一个遇到这个问题的人会很奇怪——很抱歉,如果这个问题之前有人问过这个问题,但我在任何地方都没有找到。
【问题讨论】:
-
你不是第一个遇到这种情况的。答案似乎是that's what numerical differentiation does。