2017-12-13 61 views
0

Minimizerオブジェクトを使用して関数呼び出しの数を最小限に抑える方法を教えてください。ログから次のメッセージが表示されます。Pythin lmfit library:最小化関数を使用して関数呼び出しの数を制限する方法

関数呼び出しが多すぎます(最大%iに設定されています)!この最大値を大きくするには、minimize(func、params、...、maxfev = NNN)またはleastsq_kws [\ 'maxfev \']を設定してください。

from numpy import sqrt, pi, exp, loadtxt 
from lmfit import Model 
from lmfit import Minimizer 
import matplotlib.pyplot as plt 

data = loadtxt('data/model1d_gauss.dat') 
x = data[:, 0] 
y = data[:, 1] 

def gaussian(x, amp, cen, wid): 
    "1-d gaussian: gaussian(x, amp, cen, wid)" 
    return (amp/(sqrt(2*pi)*wid)) * exp(-(x-cen)**2 /(2*wid**2)) 


gmodel = Model(gaussian) 

result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method= 'least_squares') 

print(result.fit_report()) 

r = result.fit_report() 

plt.plot(x, y,   'bo') 
plt.plot(x, result.init_fit, 'k--') 
plt.plot(x, result.best_fit, 'r-') 
plt.show() 

lmfit documentation link

Github link

私は私がこれを推薦する場合

答えて

0

わからない(データの多くは、とにかくうるさいがらくたである)関数呼び出しを最小化することにより、より高速なフィッティングを作りたいですしかし、scipyのleast_squaresを内部的に使用している場合は、必要なオプションを渡すだけで済みます。

result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method='least_squares', 
        fit_kws={'max_nfev': 100}) 

もちろん、これはlmfitがmaxiter reachedの状態を観察した後に状態を受け入れることを前提としています。しかしあなたの質問からは、これは警告としてのみ扱われます。

このオプティマイザは、公差の規準に基づいていることを、覚えておいてください(ドキュメントを参照)、手順の与えられたx数が収束していないとき、それは実際にそれはまだ最小化を向上させることができますを考えて!

コメントで尋ねられたように:はい、これらの基準も変更できます。行うことによって:

result = gmodel.fit(y, x=x, amp=5, cen=1, wid=1,method='least_squares', 
       fit_kws={'ftol': 1-07, # default 1e-08 
         'xtol': 1-07, #   1e-08 
         'gtol': 1-07}) #   1e-08 
+0

許容誤差があるまでデータを適合させることができますか?もしそうなら、そのコードスニペットは何ですか? – im281

+0

@ im281 [here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html)に記載されているパラメータを使用できます。私はいくつかの例を加えました。 – sascha

+0

優秀!それはまさに私が必要としたものです – im281

関連する問題