https://blog.csdn.net/weixin_43991178/article/details/100532618
https://blog.csdn.net/Night___Raid/article/details/105400547?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242
本篇博客结合例子 详细 介绍一下 Ceres库 的基本使用方法
Ceres 可以解决边界约束鲁棒 非线性最小二乘法优化问题,其概念可表达如下:
其在工程和科学领域有非常广泛的应用,比如统计学中的曲线拟合,或者在计算机视觉中依据图像进行三维模型的构建等
使用Ceres求解非线性优化问题,可以分为三个步骤:
1. 构建代价函数(cost function)
代价函数,也就是寻优的目标式。这个部分需要使用仿函数(functor)这一技巧来实现,做法是定义一个cost function的结构体,在结构体内重载()运算符。关于仿函数的内容可以参考这篇博客:c++仿函数 functor
2.通过代价函数构建待求解的优化问题
3.配置求解器参数并求解问题
这个步骤就是设置方程怎么求解、求解过程是否输出等
先看源码:
本部分的官方参照代码在examples/helloworld.cc
笔者在ubuntumate 18.04下进行验证,结果为:
接下来介绍一个较为复杂的问题,鲍威尔优化算法。有兴趣的可以查询其算法细节,本文主要是针对ceres的使用。
参数为 x = [x1, x2, x3, x4], 具体的函数为:
1. 构建代价函数(cost function)
2.通过代价函数构建待求解的优化问题
3.配置求解器参数并求解问题
运行结果为:
本部分为本笔记的重点,是我们第一次真正意义上的使用ceres解决非线性最小二乘问题,当然,结构是还是一致的,只需要稍加改动就可以实现。
数据来源:
1. 构建代价函数(cost function)
和前文一致,先建立损失函数,此处和前面不同的是第一次引入了数据,所以residual和前面有所区别,但这个位真正的非线性最小二乘的结构。
2.通过代价函数构建待求解的优化问题
3.配置求解器参数并求解问题
4、结果及分析
完整代码为:
输出结果为:
可以看出,结果与真实的曲线m = 0.3 m=0.3m=0.3 c = 0.1 c= 0.1c=0.1有一定的差别,这正好说明了拟合的正确性,因为我们添加了高斯噪音。
可视化的结果为: