SciPy optimize
2021-10-13
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
scipy.optimize包提供了几种常用的优化算法。 该模块包含以下几个方面:
  • 使用各种算法(例如BFGS,Nelder-Mead单纯形,牛顿共轭梯度,COBYLA或SLSQP)的无约束和约束最小化多元标量函数(minimize())
  • 全局(蛮力)优化程序(例如,anneal()basinhopping())
  • 最小二乘最小化(leastsq())和曲线拟合(curve_fit())算法
  • 标量单变量函数最小化(minim_scalar())和根查找(newton())
  • 使用多种算法(例如,Powell,Levenberg-Marquardt混合或Newton-Krylov等大规模方法)的多元方程系统求解(root)
 
算法
简介
特点
jac(梯度)
hess
bounds
Nelder-Mead
单纯形法
稳定,如果微分可信,推荐其他算法
 
无约束
 
Powell
每次搜索一个维度
不必可微
不需要
不需要
无约束
CG
非线性共轭方向
 
需要
不需要
无约束
BFGS
quasi-Newton method of Broyden
对于不平滑问题也表现良好
需要
不需要
无约束
Newton-CG
使用CG算法确定方向
适合large-scale problems
需要
需要
无约束
dogleg
dog-leg trust-region algorithm
 
需要
需要
无约束算法
trust-ncg
ewton conjugate gradient trust-region algorithm
适合large-scale problems
需要
需要(或Hessian的积)
无约束算法
trust-krylov
 
适合large-scale problems, 比trust-ncg迭代次数少
需要
需要(或Hessian的积)
无约束算法
trust-exact
 
 
需要
需要(但并不要求正定)
无约束算法
L-BFGS-B
 
 
需要
不需要
有约束
TNC
truncated Newton algorithm
 
需要
不需要
有约束
COBYLA
Constrained Optimization BY Linear Approximation method
 
不需要
有约束
 
SLSQP
Sequential Least SQuares Programming
需要
不需要
有约束
 
 

scipy.optimize.brent()求解单变量无约束优化问题

非线性规划最简单的形式是一维搜索,一维搜索的常用方法是函数逼近法和区间收缩法。
brent() 函数是SciPy.optimize 模块中求解单变量无约束优化问题最小值的首选方法。这是牛顿法和二分法的混合方法,既能保证稳定性又能快速收敛
scipy.optimize.brent(func, args=(), brack=None, tol=1.48e-08, full_output=0, maxiter=500)
主要参数:
  • func: callable f(x,*args) 目标函数 ,以函数形式表示,可以通过 *args 传递参数
  • args: tuple 可选项,以 f(x,*args) 的形式将可变参数p传递给目标函数
  • brack: tuple 可选项,搜索算法的开始区间(不是指的上下限
主要返回值:
  • xmin:  返回函数达到最小值时的(注意是局部最优,不一定是全局最优)
  • fval:  返回函数的最优值(默认不返回,仅当full_output为1时返回)
notion image
notion image

scipy.optimize.fmin()求解多变量无约束优化问题

多变量无约束优化问题的算法很多,分类方式也很多。从使用者的角度来说可以分为:只使用目标函数值、使用导数(梯度下降法)、使用二阶导数。大体来说,使用导数的算法收敛较快,使用二阶导数收敛更快,但是收敛快也容易陷入局部最优。
fmin() 函数是 SciPy.optimize 模块中求解多变量无约束优化问题(最小值)的首选方法,采用下山单纯性方法。下山单纯性方法又称 Nelder-Mead 法,只使用目标函数值,不需要导数或二阶导数值,是最重要的多维无约束优化问题数值方法之一。
scipy.optimize.fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001,maxiter=None, maxfun=None,full_output=0, disp=1, retall=0, callback=None,initial_simplex=None)
主要参数:
  • func: callable f(x,*args) 目标函数 ,以函数形式表示,可以通过 *args 传递参数
  • x0: nadarray 搜索算法的初值
  • args: tuple 可选项,以 f(x,*args) 的形式将可变参数 p 传递给目标函数
主要返回值:
  • xopt:  返回最小值时的 x 值。
  • fopt:  返回最小值时的目标函数值,fopt=func(xopt)
notion image
 
 

scipy.optimize.minimize() 求解优化问题

minimize() 函数是 SciPy.optimize 模块中求解多变量优化问题的通用方法,可以调用多种算法,支持约束优化和无约束优化。
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None,constraints=(), tol=None, callback=None,options=None)
主要参数:
  • fun: callable f(x,*args) 目标函数 ,以函数形式表示,可以通过 *args 传递参数。
  • x0: nadarray, shape(n,) 搜索算法的初值,n 是决策变量个数。
  • args: tuple 可选项,将可变参数传递给目标函数 fun、导数函数 jac 和二阶导数函数 hess。
  • method: str 可选项,选择优化算法。默认算法为 BFGS, L-BFGS-B, SLSQP(取决于问题有没有边界条件和约束条件)
  • jac:  可选项,梯度计算方法。可以以函数形式表示,或选择 '2-point', '3-point', 'cs'。该选项只能用于 CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法。
  • hess:  可选项,Hessian 矩阵计算方法。可以以函数形式表示,或选择 '2-point', '3-point', 'cs'。该选项只能用于 Newton-CG, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法。
  • bounds:  可选项,变量的边界条件(上下限,lb<=x<=ub)。该选项只能用于 Nelder-Mead, L-BFGS-B, TNC, SLSQP, Powell 和 trust-constr 算法。
  • constraints:  可选项,定义约束条件 f(x)>=0。该选项只能用于 COBYLA, SLSQP 和 trust-constr 算法,注意不同算法中对于约束条件的定义是不同的。
 
无约束问题优化算法
  • method=‘CG’ : 非线性共轭梯度算法,只能处理无约束优化问题,需要使用一阶导数函数。
  • method=‘BFGS’ : BFGS 拟牛顿法,只能处理无约束优化问题,需要使用一阶导数函数。BFGS 算法性能良好,是无约束优化问题的默认算法。
  • method=‘Newton-CG’ : 截断牛顿法,只能处理无约束优化问题,需要使用一阶导数函数,适合处理大规模问题。
  • method=‘dogleg’ : dog-leg 信赖域算法,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题,
  • method=‘trust-ncg’ : 采用牛顿共轭梯度信赖域算法,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题,适合大规模问题。
  • method=‘trust-exact’: 求解无约束极小化问题的信赖域方法,需要梯度和Hessian(不需要正定)。
  • method=‘trust-krylov’: 使用Newton-GLTR 信赖域算法度,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题,适合中大规模问题。
边界约束条件问题优化算法
  • method=‘Nelder-Mead’: 下山单纯性法,可以处理边界约束条件(决策变量的上下限),只使用目标函数,不使用导数函数、二阶导数,鲁棒性强。
  • method=‘L-BFGS-B’ : 改进的 BFGS 拟牛顿法,L- 指有限内存,-B 指边界约束,可以处理边界约束条件,需要使用一阶导数函数。L-BFGS_B 算法性能良好,消耗内存量很小,适合处理大规模问题,是边界约束优化问题的默认算法。
  • method=‘Powell’: 改进的共轭方向法,可以处理边界约束条件(决策变量的上下限)。
  • method=‘TNC’ : 截断牛顿法,可以处理边界约束条件
带有约束条件问题优化算法
  • method=‘COBYLA’ : 线性近似约束优化方法,通过对目标函数和约束条件的线性逼近处理非线性问题。只使用目标函数,不需要导数或二阶导数值,可以处理约束条件。
  • method=‘SLSQP’ : 序贯最小二乘规划算法,可以处理边界约束、等式约束和不等式约束条件。SLSQP 算法性能良好,是带有约束条件优化问题的默认算法。
  • method=‘trust-constr’ : 信赖域算法,通用的约束最优化方法,适合处理大规模问题。
notion image
Jacobian 矩阵:
Hessian 矩阵:
多元函数的泰勒展开:
(其中, 是梯度)
 
 
 
 
由于 minimize() 函数中对约束条件的形式定义为 ,因此要将问题的数学模型转换为标准形式:
 
 
 
 
 
 

线性规划

scipy.optimize.linprog(c,A_ub=None,b_ub=None,A_eq=None,b_eq=None,bounds=None,method='interior-point',callback=None,options=None,x0=None)
notion image
notion image
 
 

最小二乘

求解一个带有变量边界的非线性最小二乘问题。 给定残差f(x)(n个实变量的m维实函数)和损失函数rho(s)(标量函数),最小二乘法找到代价函数F(x)的局部最小值。 看看下面的例子。
在这个例子中,Rosenbrock函数的最小值不受自变量的限制。
请注意,我们只提供残差的向量。 该算法将成本函数构造为残差的平方和,这给出了Rosenbrock()函数。 确切的最小值是x = [1.0,1.0]
notion image
 
 

求根

标量函数
如果有一个单变量方程,则可以尝试四种不同的寻根算法。 这些算法中的每一个都需要预期根的时间间隔的端点(因为函数会改变符号)。 一般来说,brentq是最好的选择,但其他方法可能在某些情况下或学术目的有用。
定点求解
与找到函数零点密切相关的问题是找到函数的固定点的问题。 函数的固定点是函数评估返回点的点:g(x)= x。 显然,gg的不动点是f(x)= g(x)-x的根。 等价地,ff的根是g(x)= f(x)+ x的固定点。 例程fixed_point提供了一个简单的迭代方法,使用Aitkens序列加速度来估计gg的固定点,如果给出起点的话。
方程组 使用root()函数可以找到一组非线性方程的根。
有几种方法可供选择,其中hybr(默认)和lm分别使用Powell的混合方法和MINPACK中的Levenberg-Marquardt方法。
下面的例子考虑了单变量超越方程
notion image
 
  • Scipy
  • Scipy linalgScipy Ndimage
    目录