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。 感谢您的链接。不过,Tru​​st-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 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

安装numpy,scipy,gensim,jieba

将 cython 函数与 cython 方法传递给 scipy.integrate

错误:无法为使用 PEP 517 且无法直接安装的 scipy 构建***

当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?

scipy.optimize.minimize的pyOpt的x0(初始猜测)等价物?

cannot import name ‘imsave‘ from ‘scipy.misc‘