0

私はこのフィッティング操作を10日以上機能させるように努めてきました。Levenberg-Marquardtアルゴリズムを使用してフィッティングするためのC++クラスを作成し、単純な多項式でテストしたところ、フィッティングは成功しました。しかし、実験に必要な実際の実験機能では、機能していません。

私がMathematicaでフィッティングしたのと同じ関数で、そこでそれを実行しても問題ありませんでした(ただし、フィッティングごとに12秒という遅いので、C ++を使用しています)。私のプログラムは狂ったように振る舞い、フィットすると間違った結果を返します。私が使っている機能をチェックして、何か問題がないか教えてください。

以下は、クラスで使用しているフィッティングの手順です。繰り返しになりますが、これは多項式で機能したので、ここで非常に深い間違いを犯して、いくつかの特殊関数とのみ競合する可能性があります...それが私の仮定です。


私が使用する初期値は、正しい値に非常に近いものです。

追加情報が必要な場合は、お知らせください。どんな助けでも非常に高く評価されています。

4

2 に答える 2

3

さて、ざっと見てみると、あなたが持っているべきことがわかります

   parameters -= SamArray<T>::MatrixProduct(SamArray<T>::Inverse(JTJ + combinationMatrix),J); //add the new deltas to the parameters and test them

   instead of 

   parameters += SamArray<T>::MatrixProduct(SamArray<T>::Inverse(JTJ + combinationMatrix),J); //add the new deltas to the parameters and test them

Jもちろん、それは勾配であり、負の勾配ではないと仮定しています。
これは、ニュートン法または準ニュートン法 (Levenberg-Marquardt など) に当てはまります。

于 2012-05-29T13:07:46.993 に答える
2

コードが期待する結果をもたらさない理由を説明するのではなく、速度の問題に対処します。あなたはあなたのコードにあります

parameters += SamArray<T>::MatrixProduct(SamArray<T>::Inverse(JTJ + combinationMatrix),J);

これは、最初に逆行列を計算し、次に、を乗算しJます。これは別の行列であると推測されます。A X = Iこれは、最初に解いてから計算するのと基本的に同じであるため、非効率的ですA^-1 B。ここで、AおよびXは行列でIあり、は単位行列です。代わりに、A X = Bを直接解決することをお勧めします。QRLUなど、これを可能にするいくつかの分解スキームがあります。LU分解では、行列Aは上三角部分Uと下L三角部分に分割され、次のように別々に効率的に反転されます。

A X = L U X = B
U X = L^-1 B
X = U^-1 L^-1 B

これは、アルゴリズム自体の一部として実行されます。逆を直接必要とする場合は、に置き換えますBI、ご覧のとおり、必要はありません。Levenberg–Marquardtアルゴリズムを見ると、MathematicaTranspose[J].J + DiagonalMatrix[Diagonal@J]表記法を使用すると、正定値である可能性があり、コレスキー分解が利用可能であり、大幅に高速化されます。しかし、私はアルゴリズムを詳しく調べていないので、この場合、コレスキー分解は使用できない可能性があります。

\ begin{edit} chの1.5秒で3、スチュワートは2つのアルゴリズムの相対速度について説明します:反転してから乗算v。LU分解。どちらも漸近的な複雑さは同じO(n^3)ですが、係数が異なります。具体的には、方程式を解くときA X == B、invert-then-multiplyの操作カウントはですが5 n^3 /6 + l n^2、LUの操作数はですn^3 /3 + l n^2。ここで、nは行数、は列数です。2つの比率は常に1より大きく、たとえ、LU分解が反転してから乗算するよりも30%高速です。 \ end {edit}Bll == n

次に、パラメーターのセットごとにカイ2乗を2回計算します。1回は最初に決定されたとき、もう1回は次の反復と比較したときです。この値は、以前に受け入れられたパラメーターと一緒にキャッシュする必要があります。

最後に、妥当な速度でフィッティングを処理するMathematicaの能力を軽視するつもりはありません。

于 2012-05-29T15:16:40.610 に答える