marquardt和java l-m优化器实现之间有什么奇怪的区别?

a6b3iqyw  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(203)

相关背景和互联问题发布在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显然都是非平方函数):
sqrt((x-x0)^2+(y-y0)^2)-r
1-平方米((x-x0)^2+(y-y0)^2)/r
使用javal-m算法,两种形式都给出了很好的结果(几乎相同,差别很小,我想知道造成差别的原因是什么。)
但是使用eigen的l-m算法,只有第二种形式工作正常。不知怎的,第一种形式有很大的错误。
你觉得这里有什么问题?我想知道java/eigenc
l-m实现中是否有根本的区别?把这事弄清楚就好了。
我用自动和手写两种形式的导数尝试了伊根的l-m。在java中,我只使用“手写”派生词。
我是这样使用eigen的:

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, 0) - b[0], 2) + pow(matrix(i, 1) - b[1], 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;}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题