你会用 c++ 求解一个非线性优化问题吗?
Posted 海大智龙智能船研究组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你会用 c++ 求解一个非线性优化问题吗?相关的知识,希望对你有一定的参考价值。
开源代码学习 - Ceres Solver 非线性优化库
-
时间: 20200217
-
作者: JQF
-
编辑: JQF
1. 非线性优化
-
优化问题一直贯穿整个学习与生活,而且在数学上一直有很重要的地位。优化问题根据 不同应用场景有 不同的分类:如线性优化与非线性优化,无约束优化与有约束优化等等。值得一提的是,现如今我们所接触的都属于 最优化问题。 -
所谓优化,就是指在给定的目标函数中,寻找最优的一组数值映射,即 x - min f(x)。根据导数理论,我们可以借助导数方程Δf(x)=0的求解获取有效的x的取值。然而,在实际的应用场景中,f(x)的严格数学解析式常常会非常复杂 甚至没有具体形式,亦或者存在大量的自变量,这就直接导致根本无法获得导数方程,此时,就必须借助其他的方法来求解最优值了。 -
当f(x)是非线性函数时,我们称为该优化为非线性优化,其本质依旧是最优化问题,在本次分享中我们聚焦于无约束的非线性优化。(有约束优化的解决方法请自行参考学习凸优化理论以及拉格朗日乘子法) -
关于无约束优化问题,常见的方法有 梯度下降、 高斯牛顿和 LM方法,简单地来说: -
梯度下降法就是找函数梯度的反方向,一阶梯度叫 雅可比 jacobian ,二阶梯度叫 海森 hessian,通过泰勒展开,我们可以利用一阶或二阶梯度来近似求取增量,用于迭代优化。 -
高斯牛顿法就是不求海森,求雅可比之后,利用雅可比构造一个近似的海森,简化了求解难度,因为海森求解比较费劲。 -
LM就是在高斯牛顿的基础上加入了一个信赖区域,引入了一个拉格朗日乘子,来更稳定的计算增量。
2. 程序实现
-
关于详细的高斯牛顿和LM方法的推导,请参考各类书籍和博客,例如 非线性优化 和 从Gauss-Newton算法到 LM算法,这里就不再赘述,我们的目标是,在基本理解优化问题的情况下,如何利用 c++ 来求解一个具体的优化问题。 -
联系到上述具体的方法,我们在求解一个优化问题中主要涉及以下实现要点: -
矩阵的运算,包括基础的矩阵向量运算以及高级的 SVD 分解、线形方程组求解等。 -
优化中迭代方法的实现,包括梯度下降、高斯牛顿以及LM方法。 -
迭代过程的实现,包括基于残差、迭代次数、增量变化的停止迭代条件的实现。 -
要利用一种程序语言实现上述每一个模块的工作量无疑是巨大的,好在我们有很多现成的高效的工具来帮助我们解决问题,对于矩阵运算我们有 Eigen ,对于优化我们有 ceres ,也就是我们接下来要讲的开源非线性优化库 ceres-solver。
3. ceres-solver 非线性优化
-
该库是基于矩阵库 Eigen 的 c++ 库,用于求解非线性最小二乘问题,尤其广泛应用于计算机视觉以及三维点云中。
-
我根据自己的理解写了一份入门指南,详细介绍了基础模块的原理以及对应的代码怎么写,文档大概是这个样子。
中间的某一页
4. 一个详细的入门文档
-
git clone https://gitee.com/jqf64078/ceres_tutorial.git
以上是关于你会用 c++ 求解一个非线性优化问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
Matlab算法粒子群算法求解二维线性优化问题(附MATLAB代码)
单目标优化求解基于matlab遗传算法求解非线性目标函数最小值问题含Matlab源码 1574期
如果用lingo软件可以进行求解,那么用MATLAB可以实现吗
单目标优化求解基于matlab粒子群算法求解非线性目标函数最小值问题含Matlab源码 1573期