微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有像求解器这样的开箱即用的牛顿法以及提供的 jacobian 和 hessian 代码原始边界:输出显式可行:输出

如何解决有没有像求解器这样的开箱即用的牛顿法以及提供的 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 举报,一经查实,本站将立刻删除。