SciPy 优化器

SciPy 中的优化器

SciPy 的 optimize 模块提供了常用的最优化算法函数实现,可以调用这些函数完成我们的优化问题,比如查找函数的最小值,或者方程的根等。


优化函数

本质上,机器学习 中的所有算法都不过是一个将给定的数据最小化的复杂方程。


方程的根

NumPy 能够找到多项式和线性方程的根,但它不能找到 非线性方程 的根,例如:

x + cos(x)

在这种情况下,就需要使用 SciPy 的 optimze.root 函数。

这个函数有两个必须参数:fun - 表示方程的函数x0 - 初始猜测值

函数返回一个包含解决方法相关信息的对象。

实际解决方法在返回对象的属性 x 下给出:

实例

求方程 x + cos(x) 的根:

  1. from scipy.optimize import root
  2. from math import cos
  3. def eqn(x):
  4. return x + cos(x)
  5. myroot = root(eqn, 0)
  6. print(myroot.x)
注意:返回的对象包含有关解决方法的更多信息。
实例

打印有关解决方案的所有信息(不仅仅是根目录的 x

  1. from scipy.optimize import root
  2. from math import cos
  3. def eqn(x):
  4. return x + cos(x)
  5. myroot = root(eqn, 0)
  6. print(myroot)

函数最小化

在此上下文中,函数表示曲线,曲线有 高点低点

高点被称为 最大值

低点称为 最小值

整个曲线中的最高点称为 全局最大值 ,而其余点称为 局部最大值

整个曲线中的最低点称为 全局最小值 ,而其余的则称为 局部最小值


求最小值

我们可以使用scipy.optimize.minimize() 函数来最小化函数。

minimize() 函数需要以下参数:

fun - 表示方程的函数

x0 - 初始猜测值

method - 要使用的方法名称,值可以是:

  • CG
  • BFGS
  • Newton-CG
  • L-BFGS-B
  • TNC
  • COBYLA
  • SLSQP

callback - 每次优化迭代后调用的函数。

options - 定义其他参数的字典:

  1. {
  2. "disp": boolean - print detailed description
  3. "gtol": number - the tolerance of the error
  4. }
实例

使用 BFGS 最小化函数 x^2 + x + 2 :

  1. from scipy.optimize import minimize
  2. def eqn(x):
  3. return x**2 + x + 2
  4. mymin = minimize(eqn, 0, method='BFGS')
  5. print(mymin)