因为需要使用无约束非线性优化问题,所以想用拟牛顿法中的BFGS算法,在此记录一下资料收集的过程。
对于优化算法的介绍,可以参考这篇博文,博主写的比较清楚。
常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
对于scipy中一些优化算法的介绍,可以参考官方文档。
scipy.optimize
使用不同的方法,求解最小值问题,可以使用
scipy.optimize.minimize
满足初级使用,需要了解以下几个关键参数,其余细节的参数设置,还是需要对于优化问题更加深入了解才能更好使用。
tolerance和options。这里提到了tolerance可以在options中定义。而options中可以定义特定优化器的一些参数,具体可以看show_options,其中列出了所有的可用优化器,点击链接可以得到每一个优化器对应的参数设置。
返回值,返回值是一个optimizeresult的类,这个类的主要属性包括:x(自变量最优解),success(优化是否成功),message(对于迭代终止原因的描述)。
下文中详细解释了关于优化器方法选择的条件,和使用的细节。
其中,BFGS是一种拟牛顿方法,仅使用一阶微分,适用于无约束最小化问题,对于非平滑优化问题表现良好,返回的优化结果中包含Hessian矩阵的逆。
文中还给出了函数使用的实例。
使用BFGS求解目标函数rosen最小值的过程。
res = minimize(rosen, x0, method='BFGS', jac=rosen_der,
options={'gtol': 1e-6, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 26
Function evaluations: 31
Gradient evaluations: 31
res.x
array([ 1., 1., 1., 1., 1.])
print(res.message)
Optimization terminated successfully.
res.hess_inv
array([[ 0.00749589, 0.01255155, 0.02396251, 0.04750988, 0.09495377], # may vary
[ 0.01255155, 0.02510441, 0.04794055, 0.09502834, 0.18996269],
[ 0.02396251, 0.04794055, 0.09631614, 0.19092151, 0.38165151],
[ 0.04750988, 0.09502834, 0.19092151, 0.38341252, 0.7664427 ],
[ 0.09495377, 0.18996269, 0.38165151, 0.7664427, 1.53713523]])