如何使用Eigen设置Levenberg-Marquardt阻尼

时间:2016-01-10 01:55:35

标签: c++ eigen levenberg-marquardt

我成功使用了Eigen的Levenberg-Marquart课程,其示例来自:http://techblog.rga.com/determining-indoor-position-using-ibeacon/

我试图找出如何将阻尼参数lambda转换为Eigen中可用的参数:

https://en.wikipedia.org/wiki/Levenberg-Marquardt_algorithm#Choice_of_damping_parameter

http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html#a20efa2f5a684efaf2499ba5bdd51e792

我不清楚对角线移位的步骤是什么?#34;通过setFactor() - 这与阻尼参数有关吗?

distance_functor functor(matrix, count);
Eigen::NumericalDiff<distance_functor> numDiff(functor);     

Eigen::LevenbergMarquardt<Eigen::NumericalDiff<distance_functor>,double> lm(numDiff);

lm.parameters.factor = 100; //step bound for the diagonal shift, is this related to damping parameter, lambda?
lm.parameters.maxfev = 2000;//max number of function evaluations
lm.parameters.xtol = 1.49012e-08; //tolerance for the norm of the solution vector
lm.parameters.ftol = 1.49012e-08; //tolerance for the norm of the vector function
lm.parameters.gtol = 0; // tolerance for the norm of the gradient of the error vector
lm.parameters.epsfcn = 0; //error precision
Eigen::LevenbergMarquardtSpace::Status ret = lm.minimize(x);

2 个答案:

答案 0 :(得分:1)

这是来自minpack的端口,因此您还可以查看其documentation

  

factor是用于确定的正输入变量     初始步骤。这个界限设置为的产物     因素和diag * x的欧几里德范数,如果非零,或者     考虑自己。在大多数情况下,因素应该在于     间隔(.1,100。)。100。是一般推荐的值。

答案 1 :(得分:1)

Eigen::LevenbergMarquardt 不使用 Tikhonov 正则化(“阻尼参数”)来寻找下一个高斯-牛顿方向。它随后调用一个 MINPACK' 子程序 lmpar2(qrfac, m_diag, m_qtf, m_delta, m_par, m_wa1) 寻找(如果不适定)在约束下的高斯-牛顿方向 m_wa1

|| m_diag * m_wa1 || <= m_delta,

即对角矩阵 m_diag 和正参数 m_delta 的实例在每次调用 lmpar2 时都会发生变化。

https://github.com/lunixbochs/eigen/blob/master/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h

http://docs.ros.org/en/indigo/api/acado/html/lmpar_8h_source.html