2016-07-12 2 views
0

私はlmfit pythonパッケージhttps://lmfit.github.io/lmfit-py/を使用して、いくつかのパラメータのバリエーションの許容範囲内で指定された非線形関数にデータをフィッティングしています(これは主にlmfitが魅力的である理由です)。既知のローカルパラメータとlmfitのグローバルパラメータを区別する方法は?

一般に、lmfitの2つの重要なコード行は次のとおりです。

私のアプリケーションは、36個のデータグラフにグローバルにフィットすることです。キャッチは、いくつかのパラメータが(vary = None)に適合しておらず、既知量であり、36個のグラフ全体で変化しますが、グラフ内では同じままであることです。現在、これらの既知のパラメータを関連するx_dataおよびy_dataポイントに渡すために、次の構文を実装しようとしています。

def fcn2min(params, x_data, y_data, known_params): 

result = minimize(fcn2min, params, args=(x_data, y_data, known_params)) 

ここで、x_data、y_data、およびknown_paramsは同じ長さの配列です。 x_dataとy_dataは36個のグラフすべてからなる単一の配列で構成され、known_paramsは各グラフで固定されているパラメータの繰り返しエントリを持つ3列の配列です。

現在、プログラムはかなり遅い(実行が完了するまで30分)。また現時点では、フィットグラフはすべてのグラフで同じですが、既知のパラメータで各ローカルグラフにフィットさせ、グローバルパラメータのみにフィットさせたいと思います。

私はこれを正しく行っていますか?私は、なぜminim()がy_dataへの参照を必要とするのか理解していますが、なぜfcn2min()は入力としてy_dataを必要としますか? y_dataまたはknown_params配列に適合しているかどうか、私の適切なプログラムが混乱することはありますか? lmfitでこれを行うには良い方法がありますか、別の数値パッケージを探すべきですか?

答えて

0

実際のサンプルコードがなくてもすべての詳細を取得するのは少し難しいですが、いくつかのトピックを取り上げてみることができます。

まず、fcn2min()ニーズが原因minimize()の視点(基礎となるソルバ)からy_data(そしてそのことについてx_data)アレイを通過するためには、与えられた最小化される目的関数は、配列を返すことを期待します可変パラメータ - それはまったく "データ"について考えることはありません。データをフィッティングするためには、目的関数は非常に良くなるかもしれませんが、目的関数は非常にうまくいくかもしれませんが、フィッティングアルゴリズムは、配列がどのように計算されるのではなく、最小値になるようにパラメータを変更するかを気にします。これは "fit()"ではなく "minimize()"と呼ばれます。

第2に、正しく理解すれば、すべてがほぼ同じモデルを持つ多数の(36個の)データセットがあり、一部のパラメータ値はデータセットごとに異なる場合がありますが、一部のデータセットはすべてのデータセット。

lmfitでは、これを実行する最善の方法は1つのグローバルフィットを行うことです。モデルごとに36セットのパラメータを持つ1つのParameters()オブジェクトを作成します。たとえば、 "amp"、 "center"、 "sigma"、 "offset"の各パラメータを持つピーク状の関数を持つ36個のデータセットをフィッティングする場合、amp01center01sigma36,offset36。はい、それはフィットのための多くのパラメータになる可能性があります。

目的関数では、適切なパラメータのみを使用してデータセットをモデル化し、36個のデータセットに対して36個の別個の残差を構築して各データセットをループします。最後に、これらを連結して、非常に大きな配列を最小化するようにします。

36 * nparameters_per_datasetの各パラメータが独立変数である場合、おそらく36個の個別のフィットを実行していない可能性があります。しかし、もしあなたがいくつかの変数がすべてのデータセットに対して同じ値を持つと主張できれば、それらの適合は独立しないでしょう。私はこれがあなたが探しているものだと思います。

「オフセット」がすべてのデータセットで同じだったとしましょう。 1 offsetパラメータを作成し、それをすべてのデータセットに使用することができますので、offset01 ... offest36はなく、ただ1 offsetです。

より柔軟にするために、あなたはoffset01、...、offset36を定義しますが、それらの値このような定義を使用して

params = Parameters() params.add('offset01', value=0, vary=True) params.add('offset02', expr='offset01') params.add('offset03', expr='offset01') ...

を結び付けるためにlmfit制約を使用することができ、offset01はフィット感に変化し、 offset2およびoffset03は、offset01と同じ値になります。これらは独立ではなく制約されます。制約式は複雑になり、複数のパラメータ名と多くのPython関数とnumpy関数を含みます。

希望に役立ちます。

+0

あなたが正しく、私はminim()を誤解しました。モデルを返すのではなく、モデル - y_dataの復帰が必要です。モデル関数をdef fcn2min(params、x_data、y_data = None)に変更しました。そして、y_dataがNoneの場合、最後にifステートメントを置いてください。return model。これは、minim()の両方でfcn2minを使用し、params placeのresult.paramsでモデルをプロットするのに役立ちました。 – user6581543

+0

私の2番目の質問は、それぞれのknown_paramsとそれぞれのx_dataを1つのリストに組み合わせたチートです.fcn2minではforループを使ってx_dataと適切なknown_paramsを選び、fcn2minの中に割り当てます。配列を整理するためにリスト内でリストを渡そうとするたびに、minimize()はN> Mのエラーを返し続けました。 – user6581543

+0

リストやその他のデータ構造のリストを渡すことは可能ですが、目的関数は、Float64型の1次元配列でなければなりません。 –

関連する問題