找回密码
 立即注册
首页 业界区 业界 最小二乘问题详解3:线性最小二乘实例

最小二乘问题详解3:线性最小二乘实例

胥望雅 前天 11:08
1. 引言

在上一篇文章《最小二乘问题详解2:线性最小二乘求解》中笔者详细介绍了如何求解线性最小二乘问题,一般使用QR分解或者SVD分解法,这里笔者就实现一个具体的案例来验证一下。
2. 案例

总是举拟合直线的例子实在太简单了,这里就使用一个更加复杂一点问题模型:双线性变换。具体来说,假设存在两幅地图需要配置,并且找到了各自地图上的同名点,可以使用双线性变换模型来进行快速、初步的校正。也就是说一组同名点满足如下关系:

\[\begin{cases}x_1 = a_0 x_0 + b_0 y_0 + c_0 x_0 y_0 + d_0 \\y_1 = a_1 x_0 + b_1 y_0 + c_1 x_0 y_0 + d_1\end{cases}\]
其中,\((x_0,y_0)\)和\((x_1,y_1)\)是对应的同名点,也就是观测值。而\(a_0,b_0,c_0,d_0\)和\(a_1,b_1,c_1,d_1\)则是X和Y方向上的双线性变换系数,也就是待定值。对于观测值来说,这个函数是非线性的,但是对于待定值来说这个问题模型则是线性的。这也是笔者在《最小二乘问题详解1:线性最小二乘》中强调的一点:最小二乘问题是线性还是非线性,需要通过待定值来判断。
要实现这个案例,那么就需要准备一组同名点,\((x_0,y_0)\)可以通过随机数生成,\((x_1,y_1)\)则可以通过双线性变换公式加上一点噪声值来得到。另外,也不需要从头实现矩阵运算的,一定规模的矩阵运算库就可以实现线性方程组的求解,比如这里笔者使用的Eigen。具体的案例代码实现如下:
[code]#include #include #include using namespace std;using namespace Eigen;int main() {  // ========================  // 1. 设置真实参数(我们想要求解的目标)  // ========================  Vector4d params_x_true, params_y_true;  params_x_true

相关推荐

您需要登录后才可以回帖 登录 | 立即注册