C++ 如何使用特征值设置Levenberg-Marquardt阻尼

C++ 如何使用特征值设置Levenberg-Marquardt阻尼,c++,eigen,levenberg-marquardt,C++,Eigen,Levenberg Marquardt,我成功地使用了Egen的Levenberg Marquart类,下面是一个例子: 我试图找出如何将阻尼参数lambda转换为Eigen中可用的参数: 我不清楚“对角线位移的步长界限”通过设置因子()做了什么-这与阻尼参数有关吗 distance_functor functor(matrix, count); Eigen::NumericalDiff<distance_functor> numDiff(functor); Eigen::LevenbergMarquard

我成功地使用了Egen的Levenberg Marquart类,下面是一个例子:

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

我不清楚“对角线位移的步长界限”通过设置因子()做了什么-这与阻尼参数有关吗

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);
距离函子函子(矩阵,计数); 特征:NumericalDiff numDiff(函子); 本征::列文贝格马夸特lm(numDiff); lm.parameters.factor=100//对角线位移的步长界限,是否与阻尼参数lambda有关? lm.parameters.maxfev=2000//最大函数求值数 lm.parameters.xtol=1.49012e-08//解向量范数的容差 lm.parameters.ftol=1.49012e-08//向量函数范数的容差 lm.parameters.gtol=0;//误差向量梯度范数的容差 lm.parameters.epsfcn=0//误差精度 特征::LevenbergMarquardtSpace::状态ret=lm.最小化(x);
这是minpack的一个端口,因此您还可以查看其:

系数是一个正输入变量,用于确定 初始步骤边界。此界限设置为的乘积 因子和diag*x的欧氏范数,如果非零,否则 考虑自身因素。在大多数情况下,影响因素应在于 间隔(.1100。).100。是一般建议的值


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

||m_diag*m_wa1||