次のサンプル関数を最小化しようとしています:
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
このような関数を最小化する通常の方法は、Levenberg-Marquardt アルゴリズムです。この最小化を C++ で実行したいと考えており、Eigen を使用していくつかの初期テストを行ったところ、予想される解決策が得られました。
私の質問は次のとおりです。私は ie を使用して python で最適化することに慣れていscipy.optimize.fmin_powell
ます。ここで、入力関数のパラメーターは(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None)
です。を定義しfunc(x0)
、x0
ベクトルを指定して最適化を開始できます。必要に応じて、最適化パラメーターを変更できます。
現在、Eigen Lev-Marq アルゴリズムは別の方法で動作します。関数ベクトルを定義する必要があります (なぜですか?) さらに、最適化パラメーターを設定できません。によると:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.htmlおよびその他のセット関数
を使用できるはずです。setEpsilon()
しかし、次のコードがある場合:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
だから私は2つの質問があります:
関数ベクトルが必要な理由と、関数スカラーでは不十分な理由は何ですか?
私が答えを探した参考文献:
http://www.ultimatepp.org/reference$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.phpset 関数を使用して最適化パラメーターを設定するにはどうすればよいですか?