微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c++ eigen Levenberg-Marquardt 和 Java L-M 优化器实现之间的奇怪区别是什么?

如何解决c++ eigen Levenberg-Marquardt 和 Java L-M 优化器实现之间的奇怪区别是什么?

在 math stackexchange 上发布的相关背景和相互关联的问题:https://math.stackexchange.com/questions/3972648/non-linear-optimization-levenberg-marquardt-gives-different-results-using-diffe/3972674

在此发布此问题,因为它与(仅)数学无关。

我正在使用 L-M 算法来最小化 (x*,y*) = SUM(x-x0)^2+(y-y0)^2-r^2

最小化函数的形式(非平方,因为 c++ 和 java libs 显然都为我们平方了):

  1. sqrt((x-x0)^2+(y-y0)^2) - r

  2. 1 - sqrt((x-x0)^2+(y-y0)^2)/r

使用 java L-M algorithm 两种形式都可以得到很好的结果(几乎相同,差异很小,我想知道差异的原因是什么。)

但是使用 Eigen's L-M algorithm 只有第二种形式可以正常工作。不知何故,第一种形式有很大的错误

您认为这里的问题是什么?我想知道 JAVA/Eigen c++ L-M 实现是否有根本区别?解决这个问题会很棒。

我尝试了 eigen 的 L-M 与两种形式的自动和“手写”导数。在 Java 中,我只使用了“手写”派生词。

这就是我使用特征的方式:

int operator()(const Eigen::VectorXd &b,Eigen::VectorXd &fvec) const {
for(int i = 0; i < matrix.rows(); i++) {
  fvec[i] = 1 - sqrt(pow(matrix(i,0) - b[0],2) + pow(matrix(i,1) - b[1],2)) / matrix(i,2);
  //fvec[i] = sqrt(pow(matrix(i,2)) - matrix(i,2);

  /*
    * Important: LevenbergMarquardt is designed to work with objective functions that are a sum
    * of squared terms. The algorithm takes this into account: do not do it yourself.
    * In other words: objFun = sum(fvec(i)^2)
    */
}

return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。