Scipy:如何将 Bounds 与 trust-constr 一起使用?
Posted
技术标签:
【中文标题】Scipy:如何将 Bounds 与 trust-constr 一起使用?【英文标题】:Scipy: How can I use Bounds with trust-constr? 【发布时间】:2019-02-05 11:09:12 【问题描述】:对于我的受限问题,我想使用 Scipy-Trusted-Constr 算法,因为我有一个多变量的约束问题。我不想/不能分析地计算 Jacobi/Hessian 并计算它。 但是,在设置边界时,雅可比行列式的计算会崩溃:
File "C:\Python27\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py", line 56, in __init__
self.jac0 = self._compute_jacobian(jac_eq0, jac_ineq0, s0)
File "C:\Python27\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py", line 164, in _compute_jacobian
[J_ineq, S]]))
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 1237, in bmat
arr_rows.append(concatenate(row, axis=-1))
ValueError: all the input array dimensions except for the concatenation axis must match exactly
在使用旧样式边界和最新的边界对象时都会发生错误。我可以用这段代码重现错误:
import numpy as np
import scipy.optimize as scopt
def RosenbrockN(x):
result = 0
for i in range(len(x)-1):
result += 100*(x[i+1]-x[i]**2)**2+(1-x[i])**2
return result
x0 = [0.0, 0.0, 0.0]
#bounds = scopt.Bounds([-2.0,-0.5,-2.0],[2.0,0.8,0.7])
bounds = [(-2.0,2.0),(-0.5,0.8),(-2.0,0.7)]
Res = scopt.minimize(RosenbrockN, x0, \
method = 'trust-constr', bounds = bounds, \
jac = '2-point', hess = scopt.SR1())
我认为我只是误解了界限是如何设置的,但找不到我的错误。建议表示赞赏。
编辑:我还尝试了文档中给出相同结果的代码示例。 SLSQP 等其他方法适用于边界。
SciPy 版本 1.1.0,Python 版本 2.7.4,操作系统 Win 7 Ent.
【问题讨论】:
见probably related issue。 感谢您的链接。不过,Trust-constr 通常不能与约束一起工作,这令人惊讶,因为它在文档中被列为约束问题的首选算法。 那么得出的结论是 trust-constr 根本就没有界限吗? @Kvothe,Rosenbrock 示例适用于scopt.Bounds
。顺便,你可以from scipy.optimize import rosen, rosen_der, rosen_hess
好的,我不知道这个问题发生了什么(它被赞成了很多,所以我认为它在某些时候可能真的不起作用。)对我来说,问题是你有明确要求搜索保持在约束区域内,例如:Bounds(np.array([0.5, 0.5]), np.array([0.55, 2.0]), keep_feasible = True)
否则它将愉快地超出您的范围(对于中间步骤)。
【参考方案1】:
我删除了你的 jac 和 hess 参数并让它工作;也许问题出在那儿?
import numpy as np
import scipy.optimize as scopt
def RosenbrockN(x):
result = 0
for i in range(len(x)-1):
result += 100*(x[i+1]-x[i]**2)**2+(1-x[i])**2
return result
x0 = [0.0, 0.0, 0.0]
#bounds = scopt.Bounds([-2.0,-0.5,-2.0],[2.0,0.8,0.7])
bounds = [(-2.0,2.0),(-0.5,0.8),(-2.0,0.7)]
Res = scopt.minimize(RosenbrockN, x0, \
method = 'SLSQP', bounds = bounds)
print(Res)
结果是
fun: 0.051111012543332675 jac: array([-0.00297706, -0.50601892, -0.00621008]) message: 'Optimization terminated successfully.' nfev: 95 nit: 18 njev: 18 status: 0 success: True x: array([0.89475126, 0.8 , 0.63996894])
【讨论】:
您切换到完全不同的优化算法。那不是解决问题! jacobian 和 Hessian 的提供当然是有原因的,因为它更有效! 哎呀 - 很抱歉造成混乱。我的坏以上是关于Scipy:如何将 Bounds 与 trust-constr 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
将 cython 函数与 cython 方法传递给 scipy.integrate
错误:无法为使用 PEP 517 且无法直接安装的 scipy 构建***
当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?