【python】scipy包中的BFGS算法

因为需要使用无约束非线性优化问题,所以想用拟牛顿法中的BFGS算法,在此记录一下资料收集的过程。

1. 参考链接

对于优化算法的介绍,可以参考这篇博文,博主写的比较清楚。
常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
对于scipy中一些优化算法的介绍,可以参考官方文档。
scipy.optimize

2.实践

使用不同的方法,求解最小值问题,可以使用
scipy.optimize.minimize

1. 函数介绍

满足初级使用,需要了解以下几个关键参数,其余细节的参数设置,还是需要对于优化问题更加深入了解才能更好使用。

  • 函数,待优化的目标函数。函数的自变量是一个一维向量,因变量应当是一个浮点值。
    【python】scipy包中的BFGS算法_第1张图片

  • 自变量初始化,优化过程的起点,自变量的初始值。
    在这里插入图片描述

  • 优化器,其默认值为BFGS,足见其适用性。
    【python】scipy包中的BFGS算法_第2张图片

  • tolerance和options。这里提到了tolerance可以在options中定义。而options中可以定义特定优化器的一些参数,具体可以看show_options,其中列出了所有的可用优化器,点击链接可以得到每一个优化器对应的参数设置。
    【python】scipy包中的BFGS算法_第3张图片

  • 返回值,返回值是一个optimizeresult的类,这个类的主要属性包括:x(自变量最优解),success(优化是否成功),message(对于迭代终止原因的描述)。
    在这里插入图片描述
    下文中详细解释了关于优化器方法选择的条件,和使用的细节。
    在这里插入图片描述
    其中,BFGS是一种拟牛顿方法,仅使用一阶微分,适用于无约束最小化问题,对于非平滑优化问题表现良好,返回的优化结果中包含Hessian矩阵的逆。
    在这里插入图片描述

2. 函数使用

文中还给出了函数使用的实例。
在这里插入图片描述
使用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]])

你可能感兴趣的:(python,scipy,python,优化问题)