2015-06-27 217 views
2

我想在scipy中使用curve_fit來擬合一些數據的曲線。我搜索我發現這句法,使用scipy在Python中進行曲線擬合

import numpy as np 
from scipy.optimize import curve_fit 

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

xdata = np.linspace(0, 4, 50) 
y = func(xdata, 2.5, 1.3, 0.5) 
ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

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

之後,但文件是不是真的清楚,特別是對於函數func的參數,我知道x是自變量值的numpy的陣列,但什麼是,b和c?此外,這是什麼意思線,

a * np.exp(-b * x) + c 

計算Ÿ我們稱之爲與獨立變量和其他參數FUNC,但什麼是YDATA?爲什麼我們計算這種方式,

ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

最後一件事,如果我通過SciPy的得到一些函數內部的擬合模型(方程),我怎麼能在另外一個使用它?

任何幫助表示讚賞。 謝謝。

回答

2

curve_fit擬合一組數據ydata,其中每個點以自變量的值x給出某個模型函數。在該示例中,模型函數爲a * exp(-b * x) + c,其中a,bc是要確定以最佳表示該模型的數據的一些常數。

func計算的y是各數據點處的模型函數值x

在這個例子中,ydata由擬合函數模擬了一些隨機高斯(正態分佈)噪聲添加到它:

ydata = y + 0.2 * np.random.normal(size=len(xdata)) 

您可以通過繪製y(綠線)和ydata看到這個(藍點)對xdata

enter image description here

要使用擬合參數,popt,將它們傳遞到func

yfit = func(xdata, *popt) 

一個情節會告訴你的 「精確」(綠線)的比較和擬合(藍線):

enter image description here

+0

感謝@xnx,在YDATA,爲什麼數量乘以0.2? a,b和c的最佳選擇是什麼?因爲我已經嘗試了不同的a,b和c的curve_fit函數,它根本不適合,我的數據是分散的,是否有比曲線擬合更好的解決方案? – Dania

+0

0.2只是重新調整了噪音,所以沒有太多的例子;如果你不能很好地適合你的特定數據到這個'func',或許根本沒有任何'a','b','c'這個模型能很好地完成這項工作。解決方案是使用不同的模型函數'func'! – xnx

+0

謝謝,有沒有使用衆所周知的非線性函數?另外,從你的答案我知道y是模型,ydata只是一些隨機生成的數據,用來顯示擬合曲線y的效果,這是正確的嗎? – Dania