SciPy 优化器
SciPy 中的优化器
SciPy 的 optimize
模块提供了常用的最优化算法函数实现,可以调用这些函数完成我们的优化问题,比如查找函数的最小值,或者方程的根等。
优化函数
本质上,机器学习 中的所有算法都不过是一个将给定的数据最小化的复杂方程。
方程的根
NumPy 能够找到多项式和线性方程的根,但它不能找到 非线性方程 的根,例如:
x + cos(x)
在这种情况下,就需要使用 SciPy 的 optimze.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
)
from scipy.optimize import root
from math import cos
def eqn(x):
return x + cos(x)
myroot = root(eqn, 0)
print(myroot)
函数最小化
在此上下文中,函数表示曲线,曲线有 高点 和 低点 。
高点被称为 最大值 。
低点称为 最小值 。
整个曲线中的最高点称为 全局最大值 ,而其余点称为 局部最大值 。
整个曲线中的最低点称为 全局最小值 ,而其余的则称为 局部最小值 。
求最小值
我们可以使用scipy.optimize.minimize()
函数来最小化函数。
minimize()
函数需要以下参数:
fun - 表示方程的函数
x0 - 初始猜测值
method - 要使用的方法名称,值可以是:
- CG
- BFGS
- Newton-CG
- L-BFGS-B
- TNC
- COBYLA
- SLSQP
callback - 每次优化迭代后调用的函数。
options - 定义其他参数的字典:
{
"disp": boolean - print detailed description
"gtol": number - the tolerance of the error
}
实例
使用 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)