17

目的関数 (Levenberg-Marquardt アルゴリズムが望ましい) の最適化を行い、ボックス制約、線形不等式制約、および非線形不等式制約をサポートする C のライブラリを探しています。

すでにいくつかのライブラリを試しましたが、アプリケーションに必要な制約タイプを採用しているライブラリはありません。

  • GNU GSL (制約をまったくサポートしていません)
  • cMPFIT (ボックス制約のみをサポート)
  • levmar (非線形制約をまったくサポートしていません)

私は現在NLoptを調査していますが、提供されているアルゴリズムのいずれかで最小二乗法を達成できるかどうかはわかりません。

この問題の全範囲の制約をサポートする単一のライブラリがないとは信じがたいので、グーグル検索中にどこかで間違いを犯したと思います。

私は最近、C から Matlab 関数を呼び出すことができることを発見しました。これで問題は非常に簡単に解決されますが、C から Matlab 関数を呼び出す必要はありません。私の経験では高速ではありません。

どんな助けでも大歓迎です。

4

4 に答える 4

7

しばらく前に、C/C++ 最小二乗フィッティング ライブラリの状態を調査していました。あなたが提供したものを含め、いくつかのリンクを書き留めました。

  • ALGLIB/optimization -- 境界制約付きの Lev-Mar。

  • WNLIB /wnnlp -- C 言語の制約付き非線形最適化パッケージ (一般的な最適化、最小二乗法ではありません)。制約は、ペナルティ関数を追加することによって処理されます。

私はまだどのライブラリも使用していませんが、NLopt は私にとって最も有望なようです。(加重) 最小二乗フィッティング用の専用のインターフェイスとアルゴリズムがあれば、それは素晴らしいことです。

ところで、Matlab についてのメモは、非線形制約のある Lev-Mar があることを意味しますか?

于 2011-06-19T22:57:33.027 に答える
5

MPFIT:MINPACK-1つの最小二乗フィッティングライブラリ(C言語)

MPFITは、Levenberg-Marquardt手法を使用して、最小二乗問題を解きます。通常の使用法では、MPFITを使用して、パラメーターのセットを調整することにより、ユーザー提供の関数(「モデル」)をユーザー提供のデータポイント(「データ」)に適合させます。MPFITは、More'と共同研究者によるMINPACK-1(LMDIF.F)に基づいています。

http://cow.physics.wisc.edu/~craigm/idl/cmpfit.html

于 2012-03-29T12:00:18.537 に答える
5

私が最終的に従ったアプローチは次のとおりです。

  • 最適化にはNLoptを使用し、問題の二乗誤差を計算する目的関数を作成しました

  • 最も有望な結果を示したアルゴリズムは、COBYLA (局所導関数を使用しない最適化) でした。ボックス制約と非線形制約をサポートしています。線形不等式制約は、一般的に実現可能な非線形制約として導入されました。

単純なベンチマークは、Lev-Mar アプローチよりも収束が少し遅いことを示していますが、制約が必要なため速度が犠牲になっています。

于 2011-06-22T11:01:31.057 に答える
0

OPTIF9は (Fortran から) C に変換することができ、既に誰かによって変換されている可能性があります。

ボックス制約とは、パラメーター値の上限と下限をサポートすることを意味する場合、それを行うバージョンがあると思います。

これは難しい問題です。パラメータが境界に到達するたびに自由度が事実上 1 ずつ減少することを意味するからです。本当に望んでいないときに「壁に引っかかって」しまう可能性があります。

私たちが見つけたのは、対数またはロジット変換のようなものを介して、制約のない最小化と変換パラメーターを使用する方が良いということです。これにより、検索空間では制約がなくなりますが、モデル空間では制約されます。

他のタイプの制約に関してはわかりませんが、1 つのオプションは、目的関数の一部として、制約に違反したときに非常に悪くなるため、オプティマイザーはそれらの領域を回避します。

非常に柔軟な一連の制約がある場合、問題のない優れたアルゴリズムが必要な場合は、Metropolis-Hastingsを使用することがわかりました。私が間違っていない限り、制約に違反するサンプルが生成された場合は、単にサンプルを破棄できます。時間はかかりますが、シンプルで常に機能します。

于 2011-06-20T01:41:01.573 に答える