【问题标题】:Understanding Levenberg Marquardt enumeration returns.了解 Levenberg Marquardt 枚举返回。
【发布时间】:2018-06-21 04:01:26
【问题描述】:

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

**Expected ** : 'minimize(x)' 方法应该将我的参数向量 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?

【问题讨论】:

  • 听起来grep -IR RelativeErrorTooSmall 是你的朋友。您可以访问源代码吗?还是只有标题?
  • 访问 LevenbergMarquardt.cpp?那是不存在的。该类由实现所有方法的结构组成。如果您要我的 cpp,我可以包含它,但它很大。
  • 谁派你来的?是作业还是工作?

标签: c++ eigen levenberg-marquardt


【解决方案1】:

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

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

xnorm 是由算法动态计算的。它是对参数在某种绝对意义上趋于多大的估计。 (将您的问题扩展到参数的绝对值趋向于统一是一种很好的做法。) Parameters.xtol 是一个数字,用户可以将其设置为参数的“小”差异。一个典型值是机器效率的平方根。确实,这是代码中的默认值。

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

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

  2. 问题的条件不佳,这意味着 Hessian 在参数空间的某个方向上比其他方向大得多。确保您的参数缩放良好,并至少使用双精度。可能需要使用条件矩阵。太深了,这里就不赘述了。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多