了解 Levenberg Marquardt 枚举 returns。
Understanding Levenberg Marquardt enumeration returns.
问题 : 我最近接到了设计非线性求解器的任务,但我的求解器没有收敛到正确的解。
**预期**:'minimize(x)' 方法应将我的参数向量 x 减少到最小值。
Observed :在我调用 'minimize(x)' 之后,我得到一个状态 return,上面写着 RelativeErrorTooSmall。
问题 : 谁能解释一下这个枚举值是什么意思?
文档:关于 Eigen Levenberg Marquardt class 的唯一可用文档基本上是 .h 文件。这是枚举列表:
enum Status {
NotStarted = -2,
Running = -1,
ImproperInputParameters = 0,
RelativeReductionTooSmall = 1,
RelativeErrorTooSmall = 2,
RelativeErrorAndReductionTooSmall = 3,
CosinusTooSmall = 4,
TooManyFunctionEvaluation = 5,
FtolTooSmall = 6,
XtolTooSmall = 7,
GtolTooSmall = 8,
UserAsked = 9
};
这是头文件的link:https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html
这是以前的堆栈溢出问题,其中包含测试程序:
How to use the Eigen unsupported levenberg marquardt implementation?
搜索 .h 文件发现这段 return 代码意味着在某个步骤算法无法声明成功,但在调整该步骤的参数方面进展甚微。
if (delta <= parameters.xtol * xnorm)
return LevenbergMarquardtSpace::RelativeErrorTooSmall;
项 xnorm 是由算法动态计算的。它是对参数在某种绝对意义上倾向于多大的估计。 (最好将问题缩放到参数的绝对值趋于一致。)Parameters.xtol 是一个数字,用户可以将其设置为 "small" 参数差异。典型值是机器效率的平方根。实际上,这是代码中的默认值。
假设库代码正确,收敛失败可能是由于以下任一原因:
对函数计算准确度的估计过于乐观。尝试将 Parameters.xtol 设置得大一些。至少使用 double 精度。确保所有参数的比例大致相同。
问题条件不好,这意味着 Hessian 在参数 space 的某些方向上比其他方向大得多。确保您的参数缩放良好,并至少使用双精度。可能需要使用条件矩阵。这太深了,无法进入这里。
计算出的梯度不是损失函数梯度的良好估计。如果问题条件良好,则梯度计算或损失函数计算有问题。针对梯度的有限差分估计测试它们。
我拥有自己的经过充分测试的超快速解算器。我很想与您取得联系,但 SO 并不热衷于此。
问题 : 我最近接到了设计非线性求解器的任务,但我的求解器没有收敛到正确的解。
**预期**:'minimize(x)' 方法应将我的参数向量 x 减少到最小值。
Observed :在我调用 'minimize(x)' 之后,我得到一个状态 return,上面写着 RelativeErrorTooSmall。
问题 : 谁能解释一下这个枚举值是什么意思?
文档:关于 Eigen Levenberg Marquardt class 的唯一可用文档基本上是 .h 文件。这是枚举列表:
enum Status {
NotStarted = -2,
Running = -1,
ImproperInputParameters = 0,
RelativeReductionTooSmall = 1,
RelativeErrorTooSmall = 2,
RelativeErrorAndReductionTooSmall = 3,
CosinusTooSmall = 4,
TooManyFunctionEvaluation = 5,
FtolTooSmall = 6,
XtolTooSmall = 7,
GtolTooSmall = 8,
UserAsked = 9
};
这是头文件的link:https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html
这是以前的堆栈溢出问题,其中包含测试程序: How to use the Eigen unsupported levenberg marquardt implementation?
搜索 .h 文件发现这段 return 代码意味着在某个步骤算法无法声明成功,但在调整该步骤的参数方面进展甚微。
if (delta <= parameters.xtol * xnorm)
return LevenbergMarquardtSpace::RelativeErrorTooSmall;
项 xnorm 是由算法动态计算的。它是对参数在某种绝对意义上倾向于多大的估计。 (最好将问题缩放到参数的绝对值趋于一致。)Parameters.xtol 是一个数字,用户可以将其设置为 "small" 参数差异。典型值是机器效率的平方根。实际上,这是代码中的默认值。
假设库代码正确,收敛失败可能是由于以下任一原因:
对函数计算准确度的估计过于乐观。尝试将 Parameters.xtol 设置得大一些。至少使用 double 精度。确保所有参数的比例大致相同。
问题条件不好,这意味着 Hessian 在参数 space 的某些方向上比其他方向大得多。确保您的参数缩放良好,并至少使用双精度。可能需要使用条件矩阵。这太深了,无法进入这里。
计算出的梯度不是损失函数梯度的良好估计。如果问题条件良好,则梯度计算或损失函数计算有问题。针对梯度的有限差分估计测试它们。
我拥有自己的经过充分测试的超快速解算器。我很想与您取得联系,但 SO 并不热衷于此。