理解Levenberg Marquardt枚举返回。

时间:2018-01-11 18:22:18

标签: c++ eigen levenberg-marquardt

问题:我最近负责设计非线性求解器,但我的解算器没有收敛到正确的解。

**预期**:'minimize(x)'方法应该将我的参数向量x减少到最小值。

观察:在我调用'minimize(x)'后,我得到一个状态返回,表示RelativeErrorTooSmall。

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

文档:关于Eigen Levenberg Marquardt类的唯一可用文档基本上是.h文件。以下是枚举列表:

string proto = Serializer.GetProto<CAcct>();

以下是标题文件的链接:https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html

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

1 个答案:

答案 0 :(得分:1)

通过.h文件搜索显示,此返回代码表示在某个步骤中算法无法声明成功,但在调整该步骤的参数方面几乎没有取得任何进展。

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

术语 xnorm 由算法即时计算。它是在某种绝对意义上估计参数的大小。 (最好将问题扩展到参数,绝对值往往大约是1。) Parameters.xtol 是一个用户可以设置为参数“小”差异的数字。典型值是机器效率的平方根。实际上,这是代码中的默认值。

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

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

  2. 问题没有很好的条件,这意味着Hessian在参数空间的某个方向上比其他方向大得多。确保您的参数缩放良好,并至少使用双倍精度。可能需要使用调节基质。这太深了,无法进入这里。

  3. 计算的梯度不是损失函数梯度的良好估计。如果问题条件良好,则梯度计算或损失函数计算都会出错。根据梯度的有限差分估计来测试它们。

  4. 我拥有自己经过充分测试和超快速的求解器。我很乐意与你取得联系,但我并不热衷于此。