web-dev-qa-db-ja.com

Scipy curvefit RuntimeError:Optimal parameters not found:functionの呼び出し回数がmaxfev = 1000に達しました

対数的適合を作りたい。しかし、私は実行時エラーを取得し続けます:

最適なパラメーターが見つかりません:関数の呼び出し回数が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()
17
Tjitze

元のデータはt1およびF1。したがって、curve_fitt1を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()

enter image description here

16
unutbu

インポート文を修正した後:

#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)

次の出力が生成されました。

enter image description here

2
StuGrey

Curve_fit()は反復を使用して最適なパラメーターを検索します。反復回数が設定数の1000を超えているが、最適なパラメーターがまだ利用できない場合、このエラーが発生します。 curve_fit()にいくつかの初期推測パラメーターを指定して、再試行できます。

1
Hanrong Zheng

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で開始します。

1
embulldogs99