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

**预期**:'minimize(x)'方法应将我的参数 vector x降至最小值。

观察到的:在我调用“minimize(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是用户可以将参数设置为“小”差异的数字。典型值是机器效率的平方根。实际上,这是代码中的默认值。

假设库代码正确,那么收敛失败可能是由于以下原因之一:
  • 过于乐观地估计函数计算的准确性。尝试将Parameters.xtol设置得更大一些。至少使用 double 。确保所有参数的比例大致相同。
  • 这个问题的条件不是很好,这意味着参数空间中的某个方向的Hessian比其他方向的要大得多。确保参数缩放正确,并至少使用 double 。可能有必要使用条件矩阵。太深了,无法进入这里。
  • 计算得出的梯度不是损失函数的梯度的好估计。如果问题得到很好解决,则梯度计算或损失函数计算都会出错。针对梯度的有限差分估计对它们进行测试。

  • 我拥有自己的经过测试和超快速的求解器。我很想与您取得联系,但是SO对此并不热衷。

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

    10-12 18:09