質問

私は非線形カーブフィッティングルーチンを探しています(おそらく、最も可能性の高いRやPythonで見つかったが、私は他の言語に開いていることにする)のx、yのデータを取り、それにカーブに合うことになります。

私は、文字列として私がフィットする式のタイプを指定することができるはずです。

例:

"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フィットから取得するよりも、プロセスをもう少しコントロールのためにこれをやってみたいです。 LABフィットUIは恐ろしいです。私はまた、複数の部分に範囲を分割し、異なる曲線は、範囲の異なる部分を表していできるようにしたいと思います。最後に、結果は、線形補間やI興味がないとLUTを破っています。

(速度単位)のことができるようにする必要があります

は、問題の私の現在のセットでは、私は、三角関数やEXP()を持っていると私はリアルタイムで毎秒352800回実行(およびCPUの一部のみを使用)する必要があります。だから私は、曲線をプロットし、安価な近似値を得るためにフィッタカーブを駆動するためのデータを使用しています。昔は、LUTはほとんど常に解決策だったが、最近はメモリルックアップをスキップして近似を行うと、時々速くなります。

役に立ちましたか?

解決

ご指摘の方程式の詳細を考慮せずに(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-ヘルプメーリングリストの投稿には、各(上記の各例の場合に使用されるデフォルト)と手元の方程式の具体的な形のためにその妥当性によって実装固有の最小化アルゴリズムに関する多くの議論が含まれています。特定のアルゴリズムは、ボックスの制約を扱うことができ、および(constrOptimと呼ばれる別の関数)は、線形制約のセットを処理します。このウェブサイトはまた、役立つことがあります:

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

他のヒント

あなたの最初のモデルは、実際にはのリニアの三つのパラメータで使用してRにフィットすることができます。

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

これはあなたの3つのパラメータを取得します。

第2のモデルはまた、開始値を提供することの通常の警告とRにnls()を使用して適合させることができる等、統計は最適化問題は必ずしも同じではない。の数値としての問題 - あなただけに関係なく、あなたが選択した言語のいずれかの関数形式を最適化することはできません。

チェック GNU Octaveのに - との間にその関数polyfit()と非線形制約ソルバーそれはあなたの問題に適したものを構築することが可能であるべきます。

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

の方法で構築された)(OPTIMと呼ばれています。これは、引数としての潜在的なパラメータ、関数の開始ベクトルをとります。あなたはあなた自身の誤差関数を構築行かなければならないが、それは本当に簡単です。

そして、あなたは= 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次元電子^ Xカーブのためにそれを使用して、それは非常に高速です。出力データは、(私のerr_fn中)の二乗差の和として与えられ、それがどのように適合するかの尺度であり、これは、フィッティングの終わりにエラー値が含まれます。

編集: あなたは文字列としてモデルに取る必要がある場合は、ユーザーインターフェースは、Rスクリプトとしてこの全体のモデルフィッティングプロセスを構築しており、実行するには、それを読み込むことができます。 Rは、STDINまたはファイルからテキストを取ることができますので、この関数の文字列同等を作るには余りにも難しいことではありません、それが自動的にOPTIMを実行しています。

あなたはおそらく、あなたの例(同じルーチンを使用して、多項式と有理関数)で暗黙の柔軟性を備えた単一のルーチンを見つけるつもりはない、フィットするように式の種類を把握するための文字列を解析します1つだけでみましょう。

Aの最小二乗多項式フィッタは、あなたの最初の例に適しているでしょう。 ( - quadradic、立方体、四次、などこれは、使用するどの程度の多項式あなた次第です)。あなたの第二の例のように合理的な機能のために、あなたは、適切なライブラリを見つけることができない場合は、「独自のロール」が必要になる場合があります。また、限り、あなたはデータの限界を超えて推定する必要がないとしてあなたにフィットしているし、十分に高い次の多項式は、あなたの「本当の」関数を近似するために使用できることを心に留めておく。

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

あなたの係数に制約があり、あなたがあなたのデータに合うようにしたいと思い機能の特定のタイプがあることを知って、その機能が乱雑1である場合は、

ここで、標準回帰法または他の曲線当てはめ方法はないでしょう仕事は、あなたが、遺伝的アルゴリズムを検討している?

彼らは私の最初の選択肢ではないですが、あなたはあなたが言及した第二関数の係数を見つけようとしている場合は、最高のフィット感を評価するために、非標準的な指標を使用している場合は特に、おそらくガスは---働くだろう。 /例えば、あなたが「(A + Bxの+ Cxを^ 2)/(Dxの+例^ 2)」あなたの関数とデータとの二乗差の和が最小になるように、のの係数を見つけたい場合は< em>の結果の関数の円弧長にいくつかの制約があること、そして、確率的アルゴリズムは、このアプローチをするための良い方法になるかもしれません。

いくつかの注意点:1)確率論的アルゴリズムは、の最高のソリューションを保証するものではありませんが、彼らはしばしば非常に近くなります。 2)あなたは、アルゴリズムの安定性について注意する必要があります。

長いノートに、あなたはあなたが最良のあなたのデータをフィットする機能の一部のスペースから関数を検索する段階にある場合(例えば、あなたがあなたのデータに、たとえば、第2のモデルを課すつもりはありません) 、その後、遺伝的プログラミング技術にも役立つことがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top