11

x、yデータを取得し、それに曲線を適合させる非線形曲線適合ルーチン(おそらく、RまたはPythonで見つかる可能性が最も高いですが、他の言語にも対応しています)を探しています。

フィットさせたい式のタイプを文字列として指定できるはずです。

例:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

私がこれから得られるのは、少なくとも定数(A、B、Cなど)の値であり、うまくいけば、試合の適合性に関する統計です。

これを行うための商用プログラムがありますが、私は最近、言語ライブラリで目的の表現に適合するのと同じくらい一般的なものを見つけることができると期待していました。SciPyの最適化機能でこれができるのではないかと思いますが、方程式を定義できるかどうかはわかりません。同様に、私はRで欲しいものを正確に見つけることができないようです。

私が探しているものはそこにありますか、それとも自分で転がす必要がありますか?それがそこにあるなら私はそれをするのが嫌いで、私はそれを見つけるのに苦労しています。


編集:LAB Fitから取得するよりも、プロセスをもう少し制御するためにこれを実行したいと思います。LABFitUIは恐ろしいものです。また、範囲を複数の部分に分割し、さまざまな曲線で範囲のさまざまな部分を表すことができるようにしたいと思います。結局、結果は線形補間でLUTを(速度的に)打ち負かすことができなければなりません。さもないと私は興味がありません。

現在の一連の問題では、trig関数またはexp()があり、それらを1秒あたり352,800回リアルタイムで実行する必要があります(CPUのごく一部しか使用しません)。そこで、曲線をプロットし、そのデータを使用してカーブフィッターを駆動し、より安価な近似値を取得します。昔はLUTがほとんどの場合解決策でしたが、最近ではメモリルックアップをスキップして近似を実行する方が速い場合があります。

4

6 に答える 6

8

最初のモデルは、実際には3つのパラメーターで線形であり、を使用してRに適合させることができます。

 fit <- lm(y ~ x + I(x^2), data=X)

これにより、3つのパラメーターが取得されます。

2番目のモデルはnls()、Rで使用して、開始値などを提供する必要があるという通常の警告を使用して適合させることもできます。最適化の統計的問題は、必ずしも数値的問題と同じではありません。どの言語を使用しても、関数形式を最適化することはできません。選ぶ。

于 2009-08-31T17:03:07.073 に答える
8

あなたが指摘した方程式の詳細を考慮せずに一般的な意味で(Rのパラメータ推定に関して)あなたの質問に答えるために、私はあなたがnls()またはoptim()を探していると思います...'nls'は私の最初の選択です推定された各パラメーターのエラー推定値を提供し、失敗した場合は「optim」を使用します。x、y変数がある場合:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

係数を取得するには、

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

'nls'の場合​​の標準エラーが必要な場合は、

summary(out)$parameters

ヘルプファイルとr-helpメーリングリストの投稿には、それぞれによって実装された特定の最小化アルゴリズム(上記の各例で使用されたデフォルト)と、手元の方程式の特定の形式に対するそれらの適切性に関する多くの議論が含まれています。特定のアルゴリズムはボックス制約を処理でき、constrOptim()と呼ばれる別の関数は一連の線形制約を処理します。このウェブサイトも役立つかもしれません:

http://cran.r-project.org/web/views/Optimization.html

于 2009-09-03T11:04:49.783 に答える
1

GNU Octaveをチェックしてください-そのpolyfit()と非線形制約ソルバーの間で、問題に適したものを構築できるはずです。

于 2009-08-31T16:59:06.550 に答える
1

例で示されている柔軟性を備えた単一のルーチン(同じルーチンを使用する多項式と有理関数)は、文字列を解析してどのような方程式に適合するかを判断するものは言うまでもなく、おそらく見つかりません。

最初の例には、最小二乗多項式フィッターが適しています。(使用する多項式の次数(4次、3次、4次など)はあなた次第です)。2番目の例のような有理関数の場合、適切なライブラリが見つからない場合は、「自分でロール」する必要があります。また、適合しているデータセットの制限を超えて外挿する必要がない限り、十分に高次の多項式を使用して「実」関数を近似できることを覚えておいてください。

他の人が指摘しているように、他にも、より一般化されたパラメータ推定アルゴリズムがあり、これも有用であることがわかります。ただし、これらのアルゴリズムは完全に「プラグアンドプレイ」ではありません。通常、いくつかのヘルパールーチンを記述し、モデルパラメーターの初期値のリストを提供する必要があります。これらの種類のアルゴリズムが発散したり、初期パラメーター推定値の不幸な選択のために極小値または極大値でスタックしたりする可能性があります。

于 2009-08-31T17:04:36.820 に答える
1

Rでは、これは非常に簡単です。

組み込みのメソッドはoptim()と呼ばれます。引数として、潜在的なパラメータの開始ベクトル、次に関数を取ります。独自のエラー関数を作成する必要がありますが、それは本当に簡単です。

次に、out = optim(1、err_fn)のように呼び出します。

ここで、err_fnは

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

これは、ecksesとデータにx値とy値のベクトルがあることを前提としています。必要に応じてmodel_y行を変更し、さらにパラメーターを追加します。

非線形で問題なく動作します。4次元のe^x曲線に使用し、非常に高速です。出力データには、フィッティングの最後のエラー値が含まれます。これは、(私のerr_fnの)差の2乗の合計として与えられる、フィッティングの程度の尺度です。

編集:モデルを文字列として取り込む必要がある場合は、ユーザーインターフェイスでこのモデルフィッティングプロセス全体をRスクリプトとして構築し、ロードして実行することができます。RはSTDINまたはファイルからテキストを取得できるため、この関数に相当する文字列を作成し、自動的に最適化するのはそれほど難しくありません。

于 2009-08-31T17:21:17.847 に答える
1

係数に制約があり、データに適合させたい特定のタイプの関数があり、その関数が標準の回帰法や他の曲線適合法が機能しない厄介な関数であることがわかっている場合は、次のようにします。遺伝的アルゴリズムを検討しましたか?

それらは私の最初の選択ではありませんが、あなたが言及した2番目の関数の係数を見つけようとしている場合、おそらくGAが機能します---特に非標準のメトリックを使用して最適を評価している場合。たとえば、関数とデータの二乗の差の合計が最小になり、何らかの制約があるような「(A + Bx + Cx ^ 2)/(Dx + Ex ^ 2)」の係数を見つけたい場合結果の関数の弧長では、確率的アルゴリズムがこれにアプローチするための良い方法かもしれません。

いくつかの注意点:1)確率的アルゴリズムは最良の解決策を保証するものではありませんが、多くの場合、非常に近いものになります。2)アルゴリズムの安定性に注意する必要があります。

長い話ですが、データに最適な関数空間から関数を見つけたい段階にある場合(たとえば、データに2番目のモデルを課すつもりはない場合)、次に遺伝的プログラミング手法も役立つ場合があります。

于 2009-09-01T01:52:54.333 に答える