SciPy 优化

2025年3月17日 | 阅读 3 分钟

优化包提供了各种常用的优化算法。此模块包含以下方面:

  • 全局优化例程(蛮力法、anneal()、basinhopping())
  • 使用各种算法(BFGS、Nelders-Mead 单纯形法、牛顿共轭梯度法、COBLYA)对多元标量函数进行无约束和约束最小化(minimize())。
  • 最小二乘最小化算法(leastsq() 和 curve fit())
  • 标量单变量函数最小化器(minimizer_scalar() 和求根器 newton())

Nelder-Mead 单纯形算法

Nelder-Mead 单纯形算法提供了 minimize() 函数,该函数用于最小化一个或多个变量的标量函数。

输出

final_simplex: (array([[ 1.        , -1.27109375],
       [ 1.        , -1.27118835],
       [ 1.        , -1.27113762]]), array([0., 0., 0.]))
           fun: 0.0
       message: 'Optimization terminated successfully.'
          nfev: 147
           nit: 69
        status: 0
       success: True
             x: array([ 1.        , -1.27109375])

最小二乘最小化

它用于解决变量有界的非线性最小二乘问题。给定残差(数据的观测值和预测值之间的差异)f(x)(n 个实变量的 n 维实函数)和损失函数 rho(s)(标量函数),least_square 找到成本函数 f(x) 的局部最小值:让我们考虑以下示例

输出

active_mask: array([0., 0.])
        cost: 0.0
         fun: array([0., 0.])
        grad: array([0., 0.])
         jac: array([[-30.00000045,  10.        ],
       [ -1.        ,   0.        ]])
     message: '`gtol` termination condition is satisfied.'
        nfev: 4
        njev: 4
  optimality: 0.0
      status: 1
     success: True
           x: array([1., 1.])

求根

  • 标量函数

对于单个值方程,有四种不同的求根算法。每种算法都需要一个区间的端点,在该区间内预计会出现根(因为函数改变符号)。

  • 方程组

root() 函数用于查找非线性方程的根。有各种方法,例如 hybr(默认)和 MINPACK 的 Levenberg-Marquardt 方法

让我们考虑以下方程

x2 + 3cos(x)=0

输出

fjac: array([[-1.]])
  fun: array([2.22044605e-16])
 message: 'The solution converged.'
    nfev: 10
     qtf: array([-1.19788401e-10])
       r: array([-4.37742564])
  status: 1
 success: True
       x: array([-0.91485648])

优化曲线拟合

曲线拟合是创建曲线的技术。它是一个数学函数,可以最好地拟合一系列数据点,可能受到约束。下面给出一个例子

输出

Sine funcion coefficients:
[-0.42111847  1.03945217]
Covariance of coefficients:
[[3.03920718 0.05918002]
 [0.05918002 0.43566354]]

SciPy Optimize

SciPy fsolve

scipy.optimize 库提供了 fsolve() 函数,该函数用于查找函数的根。它返回由 fun(x) = 0 定义的方程的根,并给定一个起始估计值。

请看以下示例

输出

(array([1.]), array([82.17252895]))

下一主题SciPy 统计