対数的適合を作りたい。しかし、私は実行時エラーを取得し続けます:
最適なパラメーターが見つかりません:関数の呼び出し回数がmaxfev = 1000に達しました
次のスクリプトを使用します。誰が私が間違っているのか教えてもらえますか?私はSpyderを使用していますが、まだ初心者です。
import math
import matplotlib as mpl
from scipy.optimize import curve_fit
import numpy as np
#data
F1=[735.0,696.0,690.0,683.0,680.0,678.0,679.0,675.0,671.0,669.0,668.0,664.0,664.0]
t1=[1,90000.0,178200.0,421200.0,505800.0,592200.0,768600.0,1036800.0,1371600.0,1630800.0,1715400.0,2345400.0,2409012.0]
F1n=np.array(F1)
t1n=np.array(t1)
plt.plot(t1,F1,'ro',label="original data")
# curvefit
def func(t,a,b):
return a+b*np.log(t)
t=np.linspace(0,3600*24*28,13)
popt, pcov = curve_fit(func, t, F1n, maxfev=1000)
plt.plot(t, func(t, *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
元のデータはt1
およびF1
。したがって、curve_fit
はt1
を2番目の引数としてnott
。
popt, pcov = curve_fit(func, t1, F1, maxfev=1000)
フィットしたパラメータpopt
を取得したら、func
のポイントでt
を評価して、フィット曲線を取得できます。
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
(t
(StuGreyの回答による)からゼロを削除して、Warning: divide by zero encountered in log
。)
import matplotlib.pyplot as plt
import scipy.optimize as optimize
import numpy as np
# data
F1 = np.array([
735.0, 696.0, 690.0, 683.0, 680.0, 678.0, 679.0, 675.0, 671.0, 669.0, 668.0,
664.0, 664.0])
t1 = np.array([
1, 90000.0, 178200.0, 421200.0, 505800.0, 592200.0, 768600.0, 1036800.0,
1371600.0, 1630800.0, 1715400.0, 2345400.0, 2409012.0])
plt.plot(t1, F1, 'ro', label="original data")
# curvefit
def func(t, a, b):
return a + b * np.log(t)
popt, pcov = optimize.curve_fit(func, t1, F1, maxfev=1000)
t = np.linspace(1, 3600 * 24 * 28, 13)
plt.plot(t, func(t, *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
インポート文を修正した後:
#import matplotlib as mpl
import matplotlib.pyplot as plt
コードで次のエラーが生成されました。
RuntimeWarning: divide by zero encountered in log
変化:
#t=np.linspace(0,3600*24*28,13)
t=np.linspace(1,3600*24*28,13)
次の出力が生成されました。
Curve_fit()
は反復を使用して最適なパラメーターを検索します。反復回数が設定数の1000を超えているが、最適なパラメーターがまだ利用できない場合、このエラーが発生します。 curve_fit()
にいくつかの初期推測パラメーターを指定して、再試行できます。
Scipy's
curve_fit()
反復を使用して最適なパラメーターを検索します。反復回数がデフォルトの800を超えても、最適なパラメーターが見つからない場合、このエラーが発生します。
Optimal parameters not found: Number of calls to function has reached maxfev = 800
Curve_fit()の初期推測パラメーターをいくつか指定してから、再試行してください。または、許容される反復を増やすことができます。または両方を行う!
次に例を示します。
popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], maxfev=5000)
p0は推測です
maxfevは反復の最大数です
関数が解を見つけるのに役立つ境界の設定を試みることもできます。ただし、境界とmax_nfevを同時に設定することはできません。
popt, pcov = curve_fit(exponenial_func, x, y, p0=[1,0,1], bounds=(1,3))
ソース1: https://github.com/scipy/scipy/issues/634
Source2:私自身のテストとgithubについては100%正確ではないことが判明
また、「x」値として0を使用しないことに関する他の推奨事項は、優れた推奨事項です。ゼロ除算エラーを回避するために、「x」配列を1で開始します。