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时返回)
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)
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’ : 信赖域算法,通用的约束最优化方法,适合处理大规模问题。
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)
最小二乘
求解一个带有变量边界的非线性最小二乘问题。 给定残差
f(x)
(n个实变量的m维实函数)和损失函数rho(s)
(标量函数),最小二乘法找到代价函数F(x)
的局部最小值。 看看下面的例子。在这个例子中,
Rosenbrock
函数的最小值不受自变量的限制。请注意,我们只提供残差的向量。 该算法将成本函数构造为残差的平方和,这给出了
Rosenbrock()
函数。 确切的最小值是x = [1.0,1.0]
。求根。
标量函数
如果有一个单变量方程,则可以尝试四种不同的寻根算法。 这些算法中的每一个都需要预期根的时间间隔的端点(因为函数会改变符号)。 一般来说,
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方法。下面的例子考虑了单变量超越方程