2016-10-17 2 views
2

scipy.optimize.leastsqでカーブフィッティングを実行しています。例えば。ガウスの場合:Scipy.optimize - 固定パラメータによるカーブフィッティング

def fitGaussian(x, y, init=[1.0,0.0,4.0,0.1]): 
    fitfunc = lambda p, x: p[0]*np.exp(-(x-p[1])**2/(2*p[2]**2))+p[3] # Target function 
    errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function 
    final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y)) 
    return fitfunc, final 

ここで、フィットのいくつかのパラメータの値をオプションで固定したいと思います。私は、別のパッケージlmfitを使用することが推奨されていることを発見しました。これは、避けたい、または非常に一般的です。例えば、hereです。 Iパラメータとは無関係であるnumpyの/ scipyのダウンロードと

  1. 作品(NOさらにパッケージ等)
  2. 溶液を必要とするので、それ自体、
  3. パラメータが固定またはされていない、柔軟であり、

は、私は各パラメータに条件を使用して、次のを思い付いた:

def fitGaussian2(x, y, init=[1.0,0.0,4.0,0.1], fix = [False, False, False, False]): 
    fitfunc = lambda p, x: (p[0] if not fix[0] else init[0])*np.exp(-(x-(p[1] if not fix[1] else init[1]))**2/(2*(p[2] if not fix[2] else init[2])**2))+(p[3] if not fix[3] else init[3]) 
    errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function 
    final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y)) 
    return fitfunc, final 

これはうまく動作しますが、実用的でも美しくもありません。 私の質問は:固定パラメータのためのscipyでカーブフィッティングを実行するより良い方法はありますか?あるいは、既にこのようなパラメータの修正を含むラッパーがありますか?

+0

scipyでこの機能を使用するのは良いことですが、それが存在するかどうかはわかりません。好奇心のために、なぜあなたは欲しいのですか?私の経験ではとても使いやすいです。 –

+0

私が他のパッケージを避けたいのは、このプログラムが実行されているどのコンピュータにも正しくインストールされていることを確認する必要があるからです。 – ImportanceOfBeingErnest

答えて

1

scipyを使用すると、わかっている組み込みオプションはありません。あなたは、あなたが既にしたような回避策を常に実行しなければなりません。

しかし、ラッパーパッケージを使用する場合は、自分でsymfitをお勧めしますか?これは、可読性とあまり定型化されていないコードをコアとするscipyへのラッパーです。ラインa, b, c, d = parameters('a, b, c, d')は4つのParameterオブジェクトを作る

from symfit import parameters, variables, exp, Fit, Parameter 

a, b, c, d = parameters('a, b, c, d') 
x, y = variables('x, y') 

model_dict = {y: a * exp(-(x - b)**2/(2 * c**2)) + d} 

fit = Fit(model_dict, x=xdata, y=ydata) 
fit_result = fit.execute() 

:としてsymfitでは、あなたの問題は解決されるだろう。たとえば修正する。その初期値にパラメータcは、fit.execute()を呼び出す前に、どこにも次のようにします。

c.value = 4.0 
c.fixed = True 

だから、可能な最終的な結果は次のようになります。

from symfit import parameters, variables, exp, Fit, Parameter 

a, b, c, d = parameters('a, b, c, d') 
x, y = variables('x, y') 

c.value = 4.0 
c.fixed = True 

model_dict = {y: a * exp(-(x - b)**2/(2 * c**2)) + d} 

fit = Fit(model_dict, x=xdata, y=ydata) 
fit_result = fit.execute() 

あなたのコードでよりダイナミックになりたい場合は、ドキュメントをチェックし、詳細情報については

c = Parameter(4.0, fixed=True) 

:使用してすぐParameterオブジェクトを作ることができhttp://symfit.readthedocs.io/en/latest/tutorial.html#simple-example

関連する問題