牛顿法、高斯牛顿法和列文伯克-马奎特算法都是常见的解决非线性最小二乘法问题的算法。本文主要简单介绍一下三者之间的特点和区别。
1.牛顿法
对于最小二乘法问题,我们先建立如下的数学模型:
我们需要做的就是找到以上函数的局部最小值x*,即函数F(x)的极小值点。如果函数在定义域内处处可导,那么在该极小值点处会有如下公式成立:
由此可以看出,牛顿法好像只要求F(x)的一阶导数就可以搞定出点x*。
由于牛顿法也是基于梯度下降法,所以这里我们将函数F(x+h)的一阶导数通过泰勒展开式进行展开
我们要求下降步长h只需让上式等于零即可,得到如下式子:
这里H是黑森矩阵,如下所示:
通过上式我们计算得到了下降步长h,然后再迭代更新x的值:
当满足条件时,我们就可以终止迭代,求出极小值点x*。
牛顿法有个麻烦之处就是想要求出下降步长h必须先要求出黑森矩阵H,然而黑森矩阵的求解非常复杂,如果要用代码实现起来更为复杂和繁琐。高斯牛顿法就很好地解决了这个问题。
2.高斯牛顿法
首先,我们引入雅可比矩阵。雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近。因此,雅可比矩阵类似于多元函数的导数。
假设
是一个从n维欧氏空间映射到到m维欧氏空间的函数。这个函数由m个实函数组成:
这些函数的偏导数(如果存在)可以组成一个m行n列的矩阵,这个矩阵就是所谓的雅可比矩阵:
我们已知:
我们将函数f(x+h)通过泰勒展开式进行展开:
其中J(x)是雅可比矩阵。当步长h的2范数即||h||^2很小的时候,上式又可以进一步简化,即
因为
所以
通过f(x+h)的近似,我们可以将上述式子写成
上述式子中,f=f(x),J=J(x)。所以问题又可以简化成以下数学问题,即
通过前面的推导所得到的L(h),我们可以很轻松地算出L(h)的一阶导数和二阶导数
我们令L(h)的一阶导数等于零即可求出步长h,即
求解出步长h以后,就可以更新迭代x的值
在经典的高斯牛顿法中我们一般都是令α=1,然而α是在线性搜索中找到的。线性搜索方法具有收敛性,但前提条件是对任意x都有F(x)≤F(x0),并且雅可比矩阵J(x)必须满秩。
由此可以看出,高斯牛顿法比牛顿法简单了许多,虽然要求雅可比矩阵J,但是比起求黑森矩阵还是简单不少。
3.列文伯克-马奎特算法
在我之前的一个博客中,介绍过马奎特提出的基于阻尼法来求解下降步长,即
由于
所以
令其等于零,得到如下式子:
这里μ(μ>0)是阻尼系数,在我之前的博客中有提到过,这里不再赘述。
这里简单讨论一下μ的两种极端情况,即μ很大和很小的时候。
当μ很大时,我们可以发现上述式子可以简化为
当μ很小时,我们又可以简化成下式
此时列文伯克-马奎特算法就等效成了高斯牛顿法。由此看出,列文伯克-马奎特算法其实跟高斯牛顿法差不多,只不过在L(h)的基础上加上了惩罚因子,使其能够快速收敛极小值点。