セレスソルバー:効率的な非線形最適化ライブラリー(A)
注意:セレスの公式文書に基づいて、最も英語から翻訳。これは非公式の参考資料として使用することができます。
簡単な紹介
セレス、セレスの意図は、木星と火星「準惑星」(準惑星と冥王星の降格、後)の間の軌道の近くに発見されています。Googleのオープンソースセレスソルバーライブラリには、多くの非線形最適化問題の解決のための効率的で便利なツールです。
- 公式サイト:http://ceres-solver.org/
- 送信元アドレス:https://github.com/ceres-solver/ceres-solver
- 主な機能:スピード、豊富なインターフェイスは便利、安定した動作です。
インストール
引用住所:http://ceres-solver.org/installation.html
オープンソースは、現在、インストールファイルを提供するために、当事者には該当しません。あなたは、コンパイルするソースコードをダウンロードする必要があります。
ダウンロードするにはどのように、Gitリポジトリをインストールします。Gitは、主流のバージョン管理ツールは、公式文書の使用を参照してください。
git clone https://ceres-solver.googlesource.com/ceres-solver
依存関係:
- ソースコードは、すべてのヘッダファイルなしで数学ライブラリを使用して簡単固有、。
- CMakeの、エンジニアリング・制作ツール、クロスプラットフォーム。
- Glog、オプションで、ライブラリーをログに記録します。TBB、オプション。
- GFLAGS、SuiteSparse、CXSparse、BLAS、LAPACKは、主に大規模なスパース行列を解決するために使用され、それをインストールする必要があります。
あなたは簡単にLinuxでさまざまなライブラリをインストールするには、コマンドラインを使用することができます。
sudo apt-get install cmake libatalas-base-dev libeigen3-dev libsuitesparse-dev
インストールセレス・ソルバー、セレスディレクトリに実施形態にCMakeによると、
mkdir build & cmake ..
make -j4
sudo make install
セレスはそれを使用して楽しくすることができます!例を見て、例がよくありますが、より速くそれを学びます!
以下の結果で直接実行し、
bin/simple_bundle_adjuster ../ceres-solver-1.14.0/data/problem-16-22106-pre.txt
それが成功のようですか?出力内容の多くは、のように理解していません。それが正常に実行することができ、重要ではありません、セレス成功したインストール手順を使用するの楽しいことができます。
注:この説明は以上以下のLinuxにインストールされています。寡婦基本的には同様の下では、それはいくつかの三者ライブラリというSuiteSparseをインストールして設定するには時間がかかりますが、複雑ではありません。
リアル
検索とセレス、ソルバーを使用
CMakeのツールが見つけ、セレス、同様のOpenCVのを使用することをお勧めします。
非線形最小二乗問題とは何ですか
セレス-ソルバー解ける形ような問題次式
\ [\開始{スプリット} \分_ {\ mathbf {X}}&\クワッドの\ FRAC {1} {2} \ sum_ {I} \ rho_i \左(\左\ |のf_i \左(X_ { I_1}、...、X_ {I_K} \右)右\ \ | ^ 2 \右)\\ \テキスト{ST}&\クワッドl_j \ルX - jが\ルu_j \終わり{スプリット} \]
それの少し複雑、特に何の意味?
例えば、多くのポイント騒々しい平面(スペース)、我々は直線(平面)またはカーブに合うようにしたいです。グローバルな最適化問題の例については、3次元ビジョン。
注意:一般的な線形回帰をフィッティングすることも解決するために使用することができます。
この目標は、最小値である残差と呼ばれる式目的関数セット、; \(F_iと\)関数は、コスト関数と呼ばれ、パラメータ(X_I \)\成分。\(L_iを、u_j \)関数の範囲です。
図の具体的な例を使って下の。
次のように目的関数の最小値を求めて。
\ [\ Fracの{1} {
2}(10-X)^ 2は、\] 二次導関数は、我々は、我々はセレスを解決しようとここで、10はX =しかし、0の最小値をとるときに容易に知っています。
- 最初のステップ、コスト関数\(F(X)= 10 - X \) 。
struct CostFunctor {
template <typename T>
bool operator()(const T* const x, T* residual) const {
residual[0] = T(10.0) - x[0];
return true;
}};
コードシンボル()メソッドは、テンプレート、同じタイプの入力です。
- 第二の工程は、非線形最小二乗問題を構築します。
int main(int argc, char** argv)
{
// The variable to solve for with its initial value.
double initial_x = 5.0;
double x = initial_x;
// Build the problem.
Problem problem;
// Set up the only cost function (also known as residual). This uses
// auto-differentiation to obtain the derivative (jacobian).
CostFunction* cost_function =
new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x);
// Run the solver!
Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
std::cout << "x : " << initial_x
<< " -> " << x << "\n";
return 0;
}
AutoDiffCostFunction
使用してCostFunctor
、入力として、自動分化インターフェースを提供します。
計算はexample/helloworld.cc
、対応する出力が得られます。
iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time
0 4.512500e+01 0.00e+00 9.50e+00 0.00e+00 0.00e+00 1.00e+04 0 5.33e-04 3.46e-03
1 4.511598e-07 4.51e+01 9.50e-04 9.50e+00 1.00e+00 3.00e+04 1 5.00e-04 4.05e-03
2 5.012552e-16 4.51e-07 3.17e-08 9.50e-04 1.00e+00 9.00e+04 1 1.60e-05 4.09e-03
Ceres Solver Report: Iterations: 2, Initial cost: 4.512500e+01, Final cost: 5.012552e-16, Termination: CONVERGENCE
x : 0.5 -> 10
これは実際には、線形問題の例であるが、それは非線形最適化を説明することをお勧めします。
次の記事では、より複雑な問題の一部に対処しますので、ご期待ください。