LM算法推导

本文详细介绍了LM(Levenberg-Marquardt)算法的残差向量形式推导,以及在计算机视觉和自动驾驶领域的实现。通过解析深蓝学院优化库的编程实现,阐述了Problem类的构建、优化变量的处理、雅可比矩阵计算以及阻尼因子的选择策略。同时,文章讨论了残差构造、视觉重投影残差的数学推导及其在SLAM问题中的应用,强调了手动推导残差和雅可比矩阵的重要性。
摘要由CSDN通过智能技术生成

一. 残差看成向量形式的推导

 这里的误差是符合卡方误差准则的。

再对f(x)使用VIO----相关公式解释说明_AutoGalaxy的博客-CSDN博客 常用的一阶泰勒展开

其中的J如下所示

其中的 J_{i}(x)如下所示

 把一阶泰勒展开代入F(x)得到:

 上面最下面那个式子就叫做正则方程。

对于LM算法,在上面的基础之上还要添加阻尼因子:如下所示

 再进行求导:

 Note:

1. 阻尼因子非常大,接近最速下降法。

2. 阻尼因子非常小,接近高斯牛顿法。

阻尼因子的选取,有一些专用的策略:

1 . 策略一 (经验)

2. 策略二. (定量分析)

由此衍生出来:

其中 

首先要明白:f(x+\Delta x)f(x) + J(x) \Delta{x}来近似

                       那么F(x+\Delta{x})就是由(f(x)+J(x)\Delta{x})^{T}(f(x)+J(x)\Delta{x})来近似

当 x更新成x + \Delta x_{lm}时,损失函数实际变化的数值是 F(x) - F(x+\Delta{x})

而L函数是用来近似F的函数

因此:L(\Delta{x}) = (f(x)+J(x)\Delta{x})^{T}(f(x)+J(x)\Delta{x})

我们以为的下降的数值则是 L(0) - L(\Delta{x})

因此L(0) = F(x)

因此比例因子的物理意义则是:实际损失函数变化的值  与  我们以为下降的数值  之比

 为什么比例因子较小的时候,需要增大阻尼呢?

首先,我们的目标肯定是希望,F(x)下降得越多越好,因此分母要尽可能大,分子要尽可能小。

非线性优化整理-3.Levenberg-Marquardt法(LM法)_boksic的博客-CSDN博客_lm法

二. LM算法编程实现

2.1 使用深蓝学院的优化库

公共代码解读:

Problem类:

1. 添加顶点代码

typedef std::map<unsigned long, std::shared_ptr<Vertex>> HashVertex;

HashVertex verticies_;

bool Problem::AddVertex(std::shared_ptr<Vertex> vertex) {
    if (verticies_.find(vertex->Id()) != verticies_.end()) {
        // LOG(WARNING) << "Vertex " << vertex->Id() << " has been added before";
        return false;
    } else {
        verticies_.insert(pair<unsigned long, shared_ptr<Vertex>>(vertex->Id(), vertex));
    }

    return true;
}

首先 verticies_是一个map容器类,if语句用来判断,此顶点是否已经被添加,如果已经添加,则不再添加了。找到元素返回对应元素的迭代器,否则返回最后一个元素的迭代器。

否则,就插入这个顶点,以及对应的id号,要注意顶点插入的格式要借助pair类型的模板。

2.1.1 以普通优化问题为例子(根据数据点拟合曲线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值