非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法

前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合——线性最小二乘法​zhuanlan.zhihu.com

现在来看另一个问题:非线性最小二乘法

1. 定义

首先是如何定义这里这个“非线性”。为什么前面用多项式拟合就是线性了?

对于多项式拟合,每个数据样本,误差为:

,可以看到此处误差(希望绝对值缩小到0的那个函数)和

的关系是线性的,因此这个最小二乘问题被称为 线性最小二乘。虽然

与x的关系是非线性的,最终的优化函数为

也是非线性的。

那么 非线性最小二乘 就很容易理解了,误差函数r和参数b的关系是非线性的就行了。

2. 例子——发射器位置

在一片区域里

,存在10个接收器,分别位于

,和一个无线电发射器,位置

未知。这些接收器可以测量离发射器的距离,但存在误差。Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

此时,单个接收器数据对应的误差是

很容易证明非线性关系,即

3. 求导

和线性最小二乘一样,优化的目标函数为

。其中,前面的

系数只是为了方便后面推导的书写,m是样本点的数量。

其中n是待优化参数的维度,

是r对b的雅可比矩阵。

b最优的条件就是

如果r与b是线性关系,那么

就是正规方程组(参考上一篇文章“线性最小二乘”),可以直接求解。证明的话只需要把

拆开。

此处因为r(b)的非线性,只能迭代求解这个优化问题。

4. 优化

4.1 牛顿法

先考虑一个简单的情况来引入牛顿法。在一元函数,求一个x使得f(x)=0。假如我们先猜这个根是

,距离真实的根的距离是

。使用泰勒展开

。忽略高阶项,可以得到

。所以

,如此循环。

对于多元函数,形式完全类似:

。对于over-constrained system,

,参考https://zhuanlan.zhihu.com/p/83269117,可以用伪逆

求逆。

4.2 牛顿法在非线性最小二乘中的使用

上面Section3提到,希望求根的函数F(b)为

有必要在这里停下来理一下notation。注意此处:r是误差函数,尺寸为

,m是样本点的个数

是误差函数对b的雅可比矩阵,尺寸为

,n是b的维度,是待优化参数的个数

φ是目标函数,尺寸为

F是φ的导数,是待求根的函数,尺寸为

是F对b的雅可比矩阵,尺寸为

所以为了得到

还得继续求一次导:

其中

是Eq.4的第i列的转置和r(b)列向量的点积。

下一步就是用Section4.1这个公式来迭代:

4.3 高斯牛顿法的推导 Gauss-Newton Method

Eq.6中的二阶导求解通常很麻烦,而且随着优化的进行,误差函数r(b)的值也在减小,因此决定忽略Eq.6的第二项求和:

把Eq.6 Eq.10代入到Eq.8里,得到最终的迭代公式:

观察下正规方程组的公式

可以发现,和上面的Eq.11形式上有很多相近之处。实际上高斯牛顿法实际上等价于在每个迭代步骤求解

。这种线性化非线性函数的思路在科学运算里很常见。

4.4 如何优雅地计算雅可比矩阵对于简单问题,比如上面Section2的

,可以手推求导。

但对于复杂的函数,或者没有closed-form的黑盒函数,可以考虑有限差分+autogradautograd: Efficiently computes derivatives of numpy code​github.com

4.5 高斯牛顿法小结

特点是:使用牛顿法求解

忽略二阶项

缺点:

实际应用中收敛不稳定

4.6 高斯牛顿法的变种——Levenberg–Marquardt法

更新公式:

其中

,diag此处的意思是把除了对角线的元素直接归零,然后用heuristic选择

从形式上LM法比GM法只是多了一个正则项。

5. 回到求发射器位置的例子

这里用Python的scipy.optimize.root作为求解器https://github.com/chr1shr/am205_examples/blob/master/1_data_fitting/nonlinlsq.py​github.com

sol=root(grad_phi,b_init,jac=False,method='lm')Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

红色的点是b_init,红色的×是最终收敛的解,而黑色的×是真实的位置。

一圈一圈的是

的等高线图,而求解器想要找

的点。可以看到,此处的等高线图不是规则形状,也说明了这是一个非线性最小二乘的问题。

PS: 如果是线性最小二乘(

)的话,2D情况下(n=2)的轮廓图会长这个样子:Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

更高阶的情况下是hyperellipses。

你可能感兴趣的:(非线性最小二乘法,python)