简介
Ceres-Solver是谷歌推出的开源C++库,用于求解优化问题。本文主要介绍用Ceres求解优化问题中最常见的最小二乘问题。例程来源于官网中Tutorial: Non-linear Least Squares章节, Ceres版本为1.14.
最小二乘问题
从官方文档看,Ceres可以求解如下问题:
x ∗ = arg min x ∑ i ρ i ( ∣ ∣ f i ( x i 1 , x i 2 , . . . , x i k ) ∣ ∣ 2 ) s . t . l j ≤ x j ≤ u j x^* = \argmin_x \sum_i \rho_i(||f_i(x_{i_1},x_{i_2},...,x_{i_k})||^2) \\ s.t. \quad l_j \le x_j \le u_j x∗=xargmini∑ρi(∣∣fi(xi1,xi2,...,xik)∣∣2)s.t.lj≤xj≤uj
传统的优化问题可以描述为:选择一组参数(变量),在满足一系列有关的限制条件(约束)下,使设计指标(目标)达到最优值。据此来分析上述公式:
变量
ceres可以优化多个变量,式中的 x x x就是待优化变量(下文简称变量或自变量)的集合。再次强调, x x x是变量的集合,每个变量都是向量,它们的维度可以不同。
约束
公式中仅仅对单个变量的上下限进行了约束,这看上去并不完备,因为传统优化问题可能会对多个变量做整体约束。但是在官方的Tutorial: Non-linear Least Squares章节中,约束不作为讨论的重点。
目标
从式中可以看出,待优化的目标是是多个项目的累加。沿用Ceres的命名方式,我们称每个项为"残差项"。
在Ceres中,残差项是处理的最小单元。每个残差项可以写成:
R i = ρ i ( ∣ ∣ f i ( x i ) ∣ ∣ 2 ) R_i = \rho_i(||f_i(x_i)||^2) Ri=ρi(∣∣fi(xi)∣∣2)
其中
x i = { x i 1 , x i 2 , . . . , x i k } , x i ∈ x x_i = \{x_{i_1},x_{i_2},...,x_{i_k}\}, \quad x_i \in x xi={
xi1,xi2,...,x