SciPy 优化器

SciPy 中的优化器

优化器是 SciPy 中定义的一组过程,用于求函数的最小值或方程的根。

优化函数

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

方程的根

NumPy 能够求多项式和线性方程的根,但无法求非线性方程的根,如下所示:

x + cos(x)

为此,您可以使用 SciPy 的 optimize.root 函数。

此函数需要两个必需的参数:

fun - 表示方程的函数。

x0 - 对根的初始猜测。

该函数返回一个包含有关解决方案的信息的对象。

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

实例

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

from scipy.optimize import root
from math import cos

def eqn(x):
  return x + cos(x)

myroot = root(eqn, 0)

print(myroot.x)

亲自试一试

注意:返回的对象包含有关解决方案的更多信息。

实例

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

print(myroot)

亲自试一试

最小化函数

在此上下文中,函数代表一条曲线,曲线有高点和低点。

高点称为最大值。

低点称为最小值。

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

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

查找最小值

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

minimize() 函数采用以下参数:

fun - 表示方程的函数。

x0 - 对根的初始猜测。

method - 要使用的方法的名称。合法值:

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

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

options - 定义额外参数的字典:

{
     "disp": boolean - 打印详细描述
     "gtol": number - 误差的容差
  }

实例

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

from scipy.optimize import minimize

def eqn(x):
  return x**2 + x + 2

mymin = minimize(eqn, 0, method='BFGS')

print(mymin)

亲自试一试