1. 概述
- 是一种在实数域和复数域上近似求解方程的方法
- 方法使用函数f (x)的泰勒级数的前面几项来寻找方程f (x) = 0的根
- 最大的特点就在于它的收敛速度很快
2. 算法原理
将函数f(x)在$x_0$处应用泰勒展开得,$f(x) = f(x_0) + \frac{f’(x_0)}{1!}(x - x_0) + \frac{f’’(x_0)}{2!}(x-x_0)^2 + \cdots$,我们取前两项,$f(x) = f(x_0) + f’(x_0)(x-x_0)$。
对等式两边求导数得到,
$f’(x) = f’(x_0) + f’’(x_0)\Delta x$,
当f(x)取最小值时,$f’(x) = 0$,所以我们得到,
$0 = f’(x_0)+ f’’(x_0)\Delta x$,
$\Delta x = -\frac{f’(x_0)}{f’’(x_0)}$,
这样我们就得到了牛顿法的参数迭代更新公式如下,
$x_{n+1} = x_n- \frac{f’(x_n)}{f’’(x_n}$。
例子:
求解最优化问题,函数$\min_{x\in R^n}f(x)$,其中$x^*$为目标函数的极小值。
设f(x)具有二阶连续偏导数,若第k次的迭代值为$x^{(k)}$,则可将f(x)在$x^{(k)}$附近进行二阶泰勒展开,
$f(x) = f(x^{(k)}) + g_k^T(x-x^{(k)}) + \frac{1}{2}(x-x^{(k)})^TH(x^{(k)})(x-x^{(k)})$,
其中,$g_k = g(x^{(k)}) = \bigtriangledown f(x^{(k)})$是f(x)的梯度向量在点$x^{(k)}$,$H(x^{(k)})$是f(x)的海赛矩阵$H(x^{(k)}) = [\frac{\partial^2f}{\partial x_i\partial x_j}]_{nxn}$在点$x^{(k)}$的值。
函数f(x)有极值的必要条件是在极值点处一阶导数为0,即梯度向量为0。特别的当$H(x^{(k)})$是正定矩阵时,函数f(x)的极值为极小值。对上述泰勒公式再进行求导得到,
$\bigtriangledown f(x) = g_k + H_k(x - x^{(k)})$,
其中,$H_k = H(x^{(k)})$,那么,
$g_k + H_k(x^{(k+1)} - x^{(k)}) = 0$,
$x^{(k+1)} = x^{(k)} - H_k^{-1}g_k$。
令$H_kp_k = -g_k$,
那么得到迭代公式,
$x^{(k + 1)} = x^{(k)} + p_k$。
最终可在$\bigtriangledown f(x^*)= 0$处收敛。
算法伪代码:
输入: f(x),梯度$g(x) = \bigtriangledown f(x)$,海赛矩阵H(x),精度要求$\epsilon$
输出: f(x)的极小值点$x^*$
- 取初始值$x^{(0)}$,置$k = 0$
- 计算$g_k = g(x^{(k)})$
- 若$||g_k|| \leq \epsilon$,停止得到近似解$x^* = x^{(k)}$
- 计算$H_k = H(x^{(k)})$,并求$p_k$,$H_kp_k = -g_k$
- 置$x^{(k+1)} = x^{(k)} + p_k$
- 置$k = k+1$,转2
优缺点:
- 二阶收敛,收敛速度快
- 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂
3. 实例
用牛顿法求解$f(x) = \frac{3}{2}x_1^2 - x_1*x_2 - 2x_1$的极小值。
解:由题可得,
梯度为$\nabla f(x) = (3x_1 - x_2 -2, x_2 - x_1)^T$,
$H(x) = \left[\begin{matrix} 3 & -1 \\ -1 & 1 \end{matrix}\right]$是正定矩阵。
取$x^{(0)} = (0, 0)^T$,则
$\nabla f(x^{(0)}) = (-2, 0)^T$,$H(x^{(0)}) = \left[\begin{matrix} 3 & -1 \\ -1 & 1 \end{matrix}\right]$,$H(x^{(0)})^{-1} = \left[\begin{matrix} \frac{1}{2} & \frac{1}{2} \\ \frac{1}{2} & \frac{3}{2} \end{matrix}\right]$。
$x^{(1)} = x^{(0)} - H(x^{(0)})^{-1} \nabla f(x^{0}) = (1, 1)^T$.
将$x^{(1)}$代入$\nabla f(x)$得$(0, 0)^T$,那么$x^{(1)} = (1, 1)^T$即为极小值点,那么极小值为$-1$。
4. 代码实现
1 | """ |