优化和求根 (scipy.optimize
)#
SciPy 的 optimize
模块提供了最小化(或最大化)目标函数的功能,可能受约束。它包括非线性问题求解器(支持局部和全局优化算法)、线性规划、约束和非线性最小二乘、求根以及曲线拟合。
在不同求解器之间共享的常用函数和对象有:
|
显示优化求解器附加选项的文档。 |
表示优化结果。 |
|
|
优化#
标量函数优化#
|
单变量标量函数的局部最小化。 |
minimize_scalar
函数支持以下方法:
局部(多变量)优化#
|
一个或多个变量的标量函数最小化。 |
minimize
函数支持以下方法:
- minimize(method=’Nelder-Mead’)
- minimize(method=’Powell’)
- minimize(method=’CG’)
- minimize(method=’BFGS’)
- minimize(method=’Newton-CG’)
- minimize(method=’L-BFGS-B’)
- minimize(method=’TNC’)
- minimize(method=’COBYLA’)
- minimize(method=’COBYQA’)
- minimize(method=’SLSQP’)
- minimize(method=’trust-constr’)
- minimize(method=’dogleg’)
- minimize(method=’trust-ncg’)
- minimize(method=’trust-krylov’)
- minimize(method=’trust-exact’)
约束作为单个对象或以下类的对象列表传递给 minimize
函数:
|
变量上的非线性约束。 |
|
变量上的线性约束。 |
简单边界约束单独处理,并且有一个专门的类:
|
变量上的边界约束。 |
实现 HessianUpdateStrategy
接口的拟牛顿策略可用于在 minimize
函数中近似 Hessian(仅适用于“trust-constr”方法)。实现此接口的可用拟牛顿方法有:
全局优化#
|
使用盆跳算法寻找函数的全局最小值。 |
|
通过暴力法在给定范围内最小化函数。 |
|
寻找多元函数的全局最小值。 |
|
使用 SHG 优化寻找函数的全局最小值。 |
|
使用双重退火算法寻找函数的全局最小值。 |
|
使用 DIRECT 算法寻找函数的全局最小值。 |
最小二乘和曲线拟合#
非线性最小二乘#
|
求解带有变量边界的非线性最小二乘问题。 |
线性最小二乘#
|
求解 |
|
求解带有变量边界的线性最小二乘问题。 |
|
非参数等渗回归。 |
曲线拟合#
|
使用非线性最小二乘法将函数 f 拟合到数据。 |
求根#
标量函数#
|
寻找标量函数的根。 |
|
使用 Brent 方法在括号区间内寻找函数的根。 |
|
使用 Brent 方法并结合双曲外推在括号区间内寻找函数的根。 |
|
使用 Ridder 方法在区间内寻找函数的根。 |
|
使用二分法在区间内寻找函数的根。 |
|
使用牛顿-拉夫逊(或割线或哈雷)方法寻找实函数或复函数的根。 |
|
使用 TOMS 算法 748 方法寻找根。 |
|
表示求根结果。 |
root_scalar
函数支持以下方法:
下表列出了各种情况和适当的方法,以及成功收敛到简单根(*)时每次迭代(和每次函数求值)的渐近收敛速度。二分法是所有方法中最慢的,每次函数求值增加一位精度,但保证收敛。其他括号法(最终)每次函数求值都会使精度位数增加约 50%。基于导数的方法,都建立在 newton
之上,如果初始值接近根,则可以很快收敛。它们也可以应用于定义在复平面(或其子集)上的函数。
f 的定义域 |
括号? |
导数? |
求解器 |
收敛性 |
||
---|---|---|---|---|---|---|
fprime |
fprime2 |
有保证吗? |
速率(*) |
|||
R |
是 |
不适用 |
不适用 |
|
|
|
R 或 C |
否 |
否 |
否 |
secant |
否 |
1.62 (1.62) |
R 或 C |
否 |
是 |
否 |
newton |
否 |
2.00 (1.41) |
R 或 C |
否 |
是 |
是 |
halley |
否 |
3.00 (1.44) |
另请参阅
scipy.optimize.cython_optimize
– 求根函数的类型化 Cython 版本
不动点寻找
|
寻找函数的不动点。 |
多维#
|
寻找向量函数的根。 |
root
函数支持以下方法:
逐元素最小化和求根#
线性规划 / MILP#
|
混合整数线性规划 |
|
线性规划:最小化线性目标函数,受线性等式和不等式约束。 |
linprog
函数支持以下方法:
单纯形法、内点法和修正单纯形法支持回调函数,例如:
一个演示 linprog 回调接口的示例回调函数。 |
分配问题#
求解线性分配问题。 |
|
|
近似求解二次分配问题和图匹配问题。 |
quadratic_assignment
函数支持以下方法:
实用工具#
有限差分近似#
|
标量或向量值函数导数的有限差分近似。 |
|
通过将梯度函数与梯度的(前向)有限差分近似进行比较,检查梯度函数的正确性。 |
线搜索#
|
包围函数的最小值。 |
|
寻找满足强 Wolfe 条件的 alpha 值。 |
Hessian 近似#
|
L-BFGS 近似逆 Hessian 的线性算子。 |
实现 Hessian 更新策略的接口。 |
基准问题#
|
Rosenbrock 函数。 |
|
Rosenbrock 函数的导数(即梯度)。 |
|
Rosenbrock 函数的 Hessian 矩阵。 |
|
Rosenbrock 函数的 Hessian 矩阵与向量的乘积。 |
遗留函数#
以下函数不建议在新脚本中使用;所有这些方法都可以通过上述更新、更一致的接口访问。
优化#
通用多变量方法
|
使用下坡单纯形算法最小化函数。 |
|
使用修正的 Powell 方法最小化函数。 |
|
使用非线性共轭梯度算法最小化函数。 |
|
使用 BFGS 算法最小化函数。 |
|
使用牛顿-CG 方法对函数进行无约束最小化。 |
约束多变量方法
|
使用 L-BFGS-B 算法最小化函数 func。 |
|
使用截断牛顿算法,在变量受边界约束的情况下最小化函数,并利用梯度信息。 |
|
使用线性近似约束优化 (COBYLA) 方法最小化函数。 |
|
使用序列最小二乘规划最小化函数 |
单变量(标量)最小化方法
最小二乘#
|
最小化一组方程的平方和。 |
求根#
通用非线性求解器
|
寻找函数的根。 |
|
使用 Broyden 的第一种雅可比近似方法寻找函数的根。 |
|
使用 Broyden 的第二种雅可比近似方法寻找函数的根。 |
当非线性求解器未在指定 maxiter 内收敛时引发的异常。 |
大规模非线性求解器
|
使用 Krylov 近似逆雅可比矩阵寻找函数的根。 |
|
使用(扩展)Anderson 混合方法寻找函数的根。 |
|
使用 Broyden 的第一种雅可比近似方法寻找函数的根。 |
|
一个简单的包装器,使用 solve 方法反转雅可比矩阵。 |
|
使用 Krylov 近似逆雅可比矩阵寻找函数的根。 |
简单迭代求解器
|
使用调优的对角雅可比近似寻找函数的根。 |
|
使用标量雅可比近似寻找函数的根。 |
|
使用对角 Broyden 雅可比近似寻找函数的根。 |