[TOC] 更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:<a target="_blank" href="https://www.cnblogs.com/nickchen121/p/11686958.html">http://www.javashuo.com/article/p-vozphyqp-cm.html</a>html
牛顿法(Newton method)和拟牛顿法(quasi-Newton method)和梯度降低法同样也是求解最优化问题的经常使用方法,可是他们的收敛速度比梯度降低法快。牛顿法是迭代算法,每一步都须要求目标函数的海森矩阵的逆矩阵,计算复杂;拟牛顿法经过正定矩阵近似海森矩阵的逆矩阵,简化这个计算过程。python
对于一个约束问题 $$ \underbrace{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)})=\nabla{f(x^{(k)})}$是$f(x)$的梯度向量在点$x^{(k)}$的值,$H(x^{(k)})$是$f(x)$的海森矩阵 $$ H(x)=[\frac{\partial^2f}{\partial{x_i}\partial{x_j}}]_{m*n} $$ 在点$x^{(k)}$的值。函数$f(x)$有极值的必要条件是在极值点处一阶导数为0,即梯度向量为0。特别是当$H(x^{(k)})$是正定矩阵的时候,函数$f(x)$的极值为极小值。 牛顿法利用极小点的必要条件 $$ \nabla{f(x)}=0 $$ 每次迭代中从点$x^{(k)}$开始,求目标函数的极小点,做为第$k+1$次迭代值$x^{(k+1)}$,即假设$x^{(k+1)}$知足 $$ \nabla{f(x^{(k+1)}}=0 $$ 经过泰勒二阶展开式便可得 $$ \nabla{f(x)}=g_k+H_k(x-x^{(k)}) $$ 其中$H_k=H(x^{(k)})$,由此$\nabla{f(x^{(k+1)}}=0$变成 $$ g_k+H_k(x^{(k+1)}-x^{(k)}) = 0 $$ 所以 $$ x^{(k+1)}=x^{(k)}-H_k^{-1}g_k $$ 或 $$ x^{(k+1)}=x^{(k)}+p_k $$ 其中 $$ \begin{align} & x^{(k+1)}=x^{(k)}-H_k^{-1}g_k=x^{(k)}+p_k \ & -H_k^{-1}g_k=p_k \ & H_kp_k=-g_k \end{align} $$ 使用$x^{(k+1)}=x^{(k)}-H_k^{-1}g_k$做为迭代公式的算法就是牛顿法。数据结构
从本质上去看,牛顿法是二阶收敛,梯度降低是一阶收敛,因此牛顿法更快。若是更通俗地说的话,好比你想找一条最短的路径走到一个盆地的最底部,梯度降低法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不只会考虑坡度是否够大,还会考虑你走了一步以后,坡度是否会变得更大。因此,能够说牛顿法比梯度降低法看得更远一点,能更快地走到最底部。机器学习
虽然牛顿法看起来比梯度降低法好不少,可是别忘记了牛顿法迭代过程当中须要计算海森矩阵的逆矩阵,若是数据量较大的话,牛顿法的计算开销将远远大于梯度降低法。函数
目标函数$f(x)$,梯度$g(x)=\nabla{f(x)}$,海森矩阵$H(x)$,精度要求$\epsilon$学习
$f(x)$的极小点$x^*$优化
在第4步求$p_k$的时候,$p_k=-H_k^{-1}g_k$,要求求海森矩阵的逆矩阵$H_k^{-1}$,计算会比较复杂。网站
在牛顿法的迭代中,须要计算海森矩阵的逆矩阵$H^{-1}$,这个过程是比较复杂的,而拟牛顿法则使用了一个$n$阶矩阵$G_k=G(x^{(k)})$近似替代$H_k^{-1}=H^{-1}(x^{(k)})$,此处很少赘述。人工智能