2016-04-25 6 views
1

私はデータセットを持っているので私のプロジェクトには少し問題があります。私は2つの曲線を得るためにプロットし、指数曲線でこのプロットを適合させたいと思います。データを指数曲線で近似する方法

この投稿を見た:fitting exponential decay with no initial guessing。 しかし私の例は種類が異なっています。

これは私がデータを取得していますものです:

enter image description here

次のように私のスクリプトは次のとおりです。

mask_G = np.bitwise_and(tbdata['G'] < 99.99, tbdata['GERR'] < 0.2) 
mask_R = np.bitwise_and(tbdata['R'] < 99.99, tbdata['RERR'] < 0.2) 

G_corrected = tbdata[mask_G] 
R_corrected = tbdata[mask_R] 


fig13 = plt.gcf() 
fig13.set_size_inches(16, 9) 


fig13, (ax1,ax2) = plt.subplots(1,2) 

fig_error_g = ax1.plot(G_corrected['G'], G_corrected['GERR'], '.') 
ax1.set_xlabel('G') 
ax1.set_ylabel('GERR') 
ax1.set_title('Evolution de GERR en fonction de G') 

fig_error_r = ax2.plot(R_corrected['R'], R_corrected['RERR'], '.') 
ax2.set_xlabel('R') 
ax2.set_ylabel('RERR') 
ax2.set_title('Evolution de RERR en fonction de R') 

fig13.tight_layout() 

plt.savefig('graphique.png') 

plt.show() 

私はscipyのダウンロードドキュメントに基づいており、それを書き込もうとしました:

def exponential(x,a,b,c) : 
    return a * np.exp(-b * x) + c 

xdata = G_corrected['G'] 
y = G_corrected['GERR'] 
ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

popt, pcov = curve_fit(exponential, xdata, ydata) 

しかし、私は:

/home/user/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/scipy/optimize/minpack.py:601:OptimizeWarning:パラメータの共分散が
カテゴリを推定することができませんでした= OptimizeWarning)

私はどのように処理することができますか?

はどうもありがとう;)

EDIT:

mask_G = np.bitwise_and(tbdata['G'] < 99.99, tbdata['GERR'] < 0.2) mask_R = np.bitwise_and(tbdata['R'] < 99.99, tbdata['RERR'] < 0.2) G_corrected = tbdata[mask_G] R_corrected = tbdata[mask_R] params = np.polyfit(G_corrected['G'], np.log(G_corrected['GERR']),1) a = params[0] A = np.exp(params[1]) fig13 = plt.gcf() fig13.set_size_inches(16, 9) fig13, (ax1,ax2) = plt.subplots(1,2) fig_error_g = ax1.plot(G_corrected['G'], (G_corrected['GERR']), '.') fig_error_g = ax1.plot(G_corrected['G'], (A*np.exp(a*G_corrected['G'])),'.') ax1.set_xlabel('G') ax1.set_ylabel('GERR') ax1.set_title('Evolution de GERR en fonction de G') fig_error_r = ax2.plot(R_corrected['R'], np.log(R_corrected['RERR']), '.') ax2.set_xlabel('R') ax2.set_ylabel('RERR') ax2.set_title('Evolution de RERR en fonction de R') fig13.tight_layout() plt.savefig('graphique.png') plt.show() 

と私が手::

を私はそのような私のプロットを合わせてみました

enter image description here

あなたは何ですか結果について考える?

答えて

3

最も簡単な方法は、プロットに対数スケーリングを適用することです。あなたは確かにlog(exp(x))= xを知っています。つまり、y値にlog()を適用して線形プロットを得る必要がある場合です。一度それがあれば、リニアツールボックス(Gaussian Least Square method)に合わせることができます。結果として得られる勾配は、exp(ax)のprefactorで、取得しようとします。

x軸に別の依存関係がある場合は、データのログログプロットを作成してすべての依存関係を把握すると便利です。

+0

あなたの答えに感謝します。あなたが言ったように、私はY値(つまり、編集された質問)に関するプロットに対数スケーリングを適用しました。さて、scipyから 'curve_fit'を使う必要がありますか? – Deadpool

+0

ログデータに線形フィットを使用します:http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.linregress.html - 対数スケールでデータをプロットすることはできますかそのスケールで線形であるかどうかを確認します(編集します)。たぶんログログのスケーリング、つまり両方の軸でそれを行う必要があります。 – Frank

関連する問題