Python实现梯度法(最速上升(下降)法)寻找函数极大(极小)值

  首先简介梯度法的原理。首先一个实值函数$R^{n} \rightarrow R$的梯度方向是函数值上升最快的方向。梯度的反方向显然是函数值下降的最快方向,这就是机器学习里梯度下降法的基本原理。但是运筹学中的梯度法略有不同,表现在步长的选择上。在确定了梯度方向(或反方向)是我们优化目标函数值的方向后,我们不能够直接获得最佳的步长。常规的做法是选定一个固定的步长,而运筹学中的做法是将问题转化为一个一维搜索问题,进而通过求解这个一维问题(关于步长的函数)的最大最小值获得最佳步长。

  一个好消息是若目标函数$f(x)$二次连续可微, 且海森矩阵 $∇^2 f(x)$ 负定,那么最优步长的近似值可以由如下的公式给出。$$r_k = -\frac{∇f(x^{(k)})^T∇f(x^{(k)})}{∇f(x^{(k)})^T∇^2f(x^{(k)})∇f(x^{(k)})}$$

  下面给出一例利用梯度法求函数极小值(如果是凸规划问题同时也是最小值)的Python实现:

  

posted @ 2019-10-28 14:00  思念殇千寻  阅读(2035)  评论(0编辑  收藏  举报