如何解决有没有像求解器这样的开箱即用的牛顿法以及提供的 jacobian 和 hessian 代码原始边界:输出显式可行:输出
是否有任何开箱即用的类似牛顿法的求解器允许输入参数的边界(以及提供的雅可比和黑森表达式)。
我基本上就是在 SciPy 中寻找 "trust-constr"
,除了那个似乎根本不起作用。虽然它接受边界作为参数,但它似乎只是忽略了它们。另请参阅关于此问题的此问题 Scipy: How can I use Bounds with trust-constr?。
似乎 trust-constr 没有考虑边界的问题并不完全是普遍的。最好显示一个具有像 Rosen 函数这样的标准的实例,但我最初的尝试没有奏效。所以这里有一个简单的反例
def fake_function(x):
if x[0]==0.523 and x[1]==1.43:
return -0.0318285
print("value at x not available")
def fake_grad(x):
return [9.21296,-1.98147]
def fake_hess(x):
return [[-467.451,-98.9485],[-98.9485,28.6649]]
scipy.optimize.minimize(fake_function,[0.523,1.43],method='trust-constr',jac=fake_grad,hess=fake_hess,bounds=[(0.5,0.55),(0.5,2)],options={'gtol': 1e-5,'disp': True})
显然在第一步之后这种优化没有意义,因为我在初始点通过它的值定义了函数。然而,足以表明在第一步 trust-constr 将忽略边界并要求在边界之外的点。 (现在澄清以表明 fake_function 是一个明确定义的二次可微函数,该函数太大而无法包含在最小示例中。然而,我们只需要初始点的值即可看到算法的错误行为。)
也稍微改变了界限,我意识到它并没有完全忽略它们。它根据边界选择不同的点,但它不介意跨出边界,这似乎是一个可怕的特征。
解决方法
尽管(恕我直言)糟糕的设置来证明您的问题,请考虑明确执行可行性 (2):
代码
import numpy as np
from scipy.optimize import minimize,Bounds
def fake_function(x):
print('EVAL @: ',x)
if x[0]==0.523 and x[1]==1.43:
return -0.0318285
print("value at x not available")
def fake_grad(x):
return [9.21296,-1.98147]
def fake_hess(x):
return [[-467.451,-98.9485],[-98.9485,28.6649]]
# !!!
bounds_explicit_feas = Bounds(np.array([0.5,0.5]),np.array([0.55,2.0]),keep_feasible = True)
bounds_original = [(0.5,0.55),(0.5,2)]
# !!!
minimize(fake_function,[0.523,1.43],method='trust-constr',jac=fake_grad,hess=fake_hess,bounds=bounds_explicit_feas,options={'gtol': 1e-5,'disp': True})
原始边界:输出
EVAL @: [0.523 1.43 ]
EVAL @: [0.19537876 1.56399192]
value at x not available
显式可行:输出
EVAL @: [0.523 1.43 ]
EVAL @: [0.52256323 1.49080832]
value at x not available
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。