转载于:https://www.cnblogs.com/Jessica-jie/p/7739775.html
高斯牛顿法详细叙述参考:https://www.cnblogs.com/Jessica-jie/p/7739775.html
[3]计算---非线性优化
可以使用各种优化算法来进行计算,BA现在基本都是利用LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性质来进行计算的,
LM算法是最速下降法(梯度下降法)和Gauss-Newton的结合体。
(1)最速下降法
如果对梯度比较熟悉的话,那应该知道梯度方向是函数上升最快的方向,而此时我们需要解决的问题是让函数最小化。
你应该想到了,那就顺着梯度的负方向去迭代寻找使函数最小的变量值。梯度下降法就是用的这种思想,用数学表达:
其中λ为步长。最速下降法保证了每次迭代函数都是下降的,在初始点离最优点很远的时候刚开始下降的速度非常快,
但是最速下降法的迭代方向是折线形的导致了收敛非常非常的慢。
(2)Newton型方法
现在先回顾一下中学数学,给定一个开口向上的一元二次函数,如何知道该函数何处最小?这个应该很容易就可以答上来了,对该函数求导,导数为0处就是函数最小处。
Newton型方法也就是这种思想,首先将函数利用泰勒展开到二次项:
(3)Gauss-Newton方法
既然Newton型方法计算Hessian矩阵太困难了,那有没有什么方法可以不计算Hessian矩阵呢?将泰勒展开式的二次项也去掉好像就可以避免求Hessian矩阵了吧,就像这样:
(4)LM(Levenberg-Marquadt)方法
其实LM算法的具体形式就笔者看到的就有很多种,但是本质都是通过参数λ在最速下降法和Gauss-Newton法之间切换。这里选用的是维基百科上的形式。
LM算法就由此保证了每次迭代都是下降的,并且可以快速收敛。
[4]解方程
LM算法主体就是一个方程的求解,也是其计算量最大的部分。当其近似于最速下降法的时候没有什么好讨论的,但是当其近似于Gauss-Newton法的时候,
这个最小二乘解的问题就该好好讨论一下了。以下的讨论就利用Gauss-Newton的形式来求解。
(1)稠密矩阵的最小二乘解
(2)稀疏矩阵的Cholesky分解
稀疏矩阵的话利用其稀疏的性质可以大幅减少计算量,对于稀疏矩阵的Cholesky分解就是这样。其分解形式为一个上三角矩阵的转置乘上自身:
回到Gauss-Newton最后的超定参数方程吧。既然Jacobi矩阵可以分块那我们就先分块,分块可以有效降低需要计算的矩阵的维度并以此减少计算量。
补充: