11

Java プログラムで非線形最小化 (N 個の未知数の最小残差二乗) 問題を解決する必要があります。これらを解決する通常の方法は、Levenberg-Marquardtアルゴリズムです。いくつか質問があります

  • 利用可能なさまざまな LM 実装の経験がある人はいますか? LM には少し異なる種類があり、アルゴリズムの正確な実装がその数値安定性に大きな影響を与えると聞いています。私の関数はかなりうまく機能しているので、これはおそらく問題にはなりませんが、もちろん、より良い代替手段の 1 つを選択したいと思います。ここに私が見つけたいくつかの選択肢があります:

  • LM が必要とする最初の推測を行うために一般的に使用されるヒューリスティックはありますか?

  • 私のアプリケーションでは、ソリューションにいくつかの制約を設定する必要がありますが、幸いなことにそれらは単純です: ソリューションが (物理的なソリューションであるために) 非負であることを要求するだけです。わずかにマイナスの解は、データの測定の不正確さの結果であり、明らかにゼロである必要があります。「通常の」LMを使用することを考えていましたが、未知数の一部が負になる場合はゼロに設定し、それから残りを解決するように繰り返します。本物の数学者はおそらく私を笑うでしょうが、これでうまくいくと思いますか?

ご意見ありがとうございます。

更新: これはロケット科学ではありません。解決するパラメーターの数 (N) は最大で 5 であり、データセットは解決を可能にするのに十分な大きさではないため、Java はこれを解決するのに十分効率的であると思います。そして、この問題は賢い応用数学者によって何度も解決されていると信じているので、自分で料理するのではなく、すぐに使える解決策を探しているだけです. たとえば、Scipy.optimize.minpack.leastsq は、純粋な Python であれば問題ないでしょう。

4

5 に答える 5

2

codehippo に同意します。制約に関する問題を解決する最善の方法は、それらを処理するために特別に設計されたアルゴリズムを使用することだと思います。この場合、L-BFGS-B アルゴリズムがおそらく適切なソリューションになるはずです。

ただし、python の scipy.optimize.fmin_l_bfgs_b モジュールを使用することが実行可能なオプションではない場合 (Java を使用しているため)、私が書いたライブラリを使用してみてください: L-BFGS の元の Fortran コードの Java ラッパー-B アルゴリズム。http://www.mini.pw.edu.pl/~mkobos/programs/lbfgsb_wrapperからダウンロードして、ニーズに合っているかどうかを確認できます。

于 2011-06-27T15:10:01.977 に答える
2

問題に制約がある場合は、制約のないソルバーを使用しないでください。たとえば、変数の一部が非負でなければならないことがわかっている場合は、これをソルバーに伝える必要があります。

Scipy を使用することに満足している場合は、scipy.optimize.fmin_l_bfgs_b をお勧めします。L-BFGS-B を使用して、変数に単純な境界を設定できます。

L-BFGS-B は、単なる非線形最小二乗問題ではなく、一般的な非線形目的関数を使用することに注意してください。

于 2009-06-26T23:45:13.973 に答える
2

最初の推測が解に近ければ近いほど、収束は速くなります。

あなたはそれが非線形の問題だと言いました。線形化された最小二乗解を実行できます。おそらく、最初の推測としてそのソリューションを使用できます。いくつかの非線形反復は、その仮定がどれほど良いか悪いかについて何かを教えてくれます。

別のアイデアは、別の最適化アルゴリズムを試すことです。多くの CPU で実行できる場合は、遺伝的アルゴリズムとアリ コロニー アルゴリズムを選択することをお勧めします。また、連続導関数も必要ないため、離散的で不連続なデータがある場合に便利です。

于 2009-02-12T14:07:24.310 に答える
1

FPL パッケージは非常に信頼性が高いですが、古い fortran コードを非常に文字通りに解釈するため、いくつかの癖があります (配列アクセスは 1 から始まります)。関数の動作が適切であれば、LM メソッド自体は非常に信頼できます。非負の制約を強制する簡単な方法は、パラメーターを直接使用する代わりに、パラメーターの 2 乗を使用することです。これにより偽のソリューションが導入される可能性がありますが、単純なモデルの場合、これらのソリューションは簡単に選別できます。

「制約付き」LM メソッドに使用できるコードがあります。mpfitについては、 http: //www.physics.wisc.edu/~craigm/idl/fitting.html を参照してください。Python (残念ながら Numeric に依存) と C バージョンがあります。LM メソッドは約 1500 行のコードなので、C を Java に移植したくなるかもしれません。実際、「制約付き」LM 法は、あなたが思い描いていた方法と大差ありません。mpfit では、コードは変数の範囲に対してステップ サイズを調整します。mpfitでも良い結果が得られました。

私は BFGS の経験はあまりありませんが、コードははるかに複雑であり、コードのライセンスについて明確にしたことはありません。

幸運を。

于 2009-07-25T08:21:18.540 に答える
0

私はこれらのJavaライブラリを実際に使用したことがないので、これを一粒の塩で取ります.バックエンドに基づいて、おそらく最初にJLAPACKを調べます. LAPACK はNumpyのバックエンドであり、これは基本的に Python で線形代数/数学操作を行うための標準です。少なくとも、純粋な Java ではなく、十分に最適化された C または Fortran ライブラリを使用する必要があります。大きなデータ セットの場合、これらの種類のタスクは非常に時間がかかる可能性があるためです。

初期推定値を作成する場合は、当てはめようとしている関数の種類 (および使用しているデータの種類) に大きく依存します。基本的に、必要なパラメーターの近似値を与える比較的高速な (おそらく O(N) またはそれ以上の) 計算を探すだけです。(私は最近、Numpy のガウス分布でこれを行い、平均をちょうどと推定しました。average(values, weights = counts)つまり、ヒストグラムのカウントの加重平均であり、データ セットの真の平均でした。私が探していたピークに近づいたが、十分に近くなり、アルゴリズムは残りの道を進んだ.)

制約を正に保つことに関しては、あなたの方法は合理的だと思われます。作業を行うプログラムを作成しているので、「強制非負」動作を簡単に有効または無効にし、比較のために両方の方法で実行できるようにするブール値フラグを作成するだけです。大きな不一致が発生した場合 (または、アルゴリズムの 1 つのバージョンが不当に長くかかる場合) のみ、心配する必要があります。(そして、本当の数学者は最小二乗最小化を分析的にゼロから行うでしょう;-P だから、あなたは彼らを笑うことができる人だと思います.... 冗談です.多分.)

于 2009-02-12T08:28:17.587 に答える