gpt4 book ai didi

c++ - 了解 Levenberg Marquardt 枚举返回。

转载 作者:行者123 更新时间:2023-11-28 04:51:07 24 4
gpt4 key购买 nike

问题:我最近的任务是设计一个非线性求解器,但我的求解器没有收敛到正确的解。

**预期**:“最小化(x)”方法应该将我的参数 vector x 减少到最小值。

观察到:在我调用“最小化(x)”之后,我得到一个状态返回,显示 RelativeErrorTooSmall。

问题:有人可以解释一下这个枚举值的含义吗?

文档:关于 Eigen Levenberg Marquardt 类的唯一可用文档基本上是 .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
};

这是头文件的链接:https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html

这是一个之前的堆栈溢出问题,其中包含测试程序: How to use the Eigen unsupported levenberg marquardt implementation?

最佳答案

搜索 .h 文件后发现,此返回代码意味着算法在某个步骤无法声明成功,但在调整该步骤的参数方面进展甚微。

  if (delta <= parameters.xtol * xnorm)
return LevenbergMarquardtSpace::RelativeErrorTooSmall;

xnorm 项是通过算法即时计算的。它是对参数在某种绝对意义上倾向于多大的估计。 (最好将问题缩放到参数的绝对值趋于统一。)Parameters.xtol 是一个数字,用户可以将其设置为参数中的“小”差异。典型值是机器效率的平方根。实际上,这是代码中的默认值。

假设库代码是正确的,收敛失败可能是由于以下任何原因造成的:

  1. 对函数计算的准确度估计过于乐观。尝试将 Parameters.xtol 设置得更大一些。至少使用 double 。确保所有参数的比例大致相同。

  2. 问题条件不好,这意味着 Hessian 在参数空间的某些方向上比其他方向大得多。确保您的参数缩放良好,并至少使用 double 。可能需要使用条件矩阵。这太深了,无法进入这里。

  3. 计算出的梯度不能很好地估计损失函数的梯度。如果问题条件良好,则梯度计算或损失函数计算有问题。针对梯度的有限差分估计测试它们。

我拥有自己经过充分测试的超快速解算器。我很想与您取得联系,但 SO 并不热衷于此。

关于c++ - 了解 Levenberg Marquardt 枚举返回。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48213584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com