1

我按照以下示例成功使用了 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

我不清楚通过 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);
4

2 回答 2

1

这是一个来自 minpack 的端口,所以你也可以查看它的文档

因子是用于确定初始步长界限的正输入变量。如果非零,则将此界限设置为 factor 和 diag*x 的欧几里得范数的乘积,否则设置为 factor 本身。在大多数情况下,因子应位于 (.1,100.).100 区间内。是一般推荐的值。

于 2016-01-11T19:44:11.930 回答
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

于 2021-05-23T08:08:41.710 回答