是否有任何开箱即用的牛顿求解器允许边界(以及提供的雅可比和粗麻布)
Is there any out of the box newton like solver that allows bounds (and a supplied jacobian and hessian)
是否有开箱即用的牛顿求解器允许输入参数的边界(以及提供的雅可比矩阵和黑森矩阵表达式)。
我基本上就是在 SciPy 中寻找 "trust-constr"
,除了一个似乎根本不起作用。虽然它接受边界作为参数,但它似乎只是忽略了它们。另请参阅此问题 Scipy: How can I use Bounds with trust-constr? 关于此问题。
看来trust-constr没有考虑到bounds的问题不完全是普遍的。最好显示一个像 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 是一个定义良好的二次可微函数,它太大而无法包含在最小示例中。我们只需要初始点的值就可以看到算法运行不正常。)
我也稍微改变了边界,我意识到它并没有完全忽略它们。它根据边界选择不同的点,但它不介意跨出边界,这似乎是一个糟糕的特性。
尽管用于演示问题的(恕我直言)糟糕的设置,请考虑明确执行 feasiblity (docs):
代码
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
是否有开箱即用的牛顿求解器允许输入参数的边界(以及提供的雅可比矩阵和黑森矩阵表达式)。
我基本上就是在 SciPy 中寻找 "trust-constr"
,除了一个似乎根本不起作用。虽然它接受边界作为参数,但它似乎只是忽略了它们。另请参阅此问题 Scipy: How can I use Bounds with trust-constr? 关于此问题。
看来trust-constr没有考虑到bounds的问题不完全是普遍的。最好显示一个像 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 是一个定义良好的二次可微函数,它太大而无法包含在最小示例中。我们只需要初始点的值就可以看到算法运行不正常。)
我也稍微改变了边界,我意识到它并没有完全忽略它们。它根据边界选择不同的点,但它不介意跨出边界,这似乎是一个糟糕的特性。
尽管用于演示问题的(恕我直言)糟糕的设置,请考虑明确执行 feasiblity (docs):
代码
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