2014-11-24 38 views
1

我試圖用Scipy curve_fit將我的數據擬合成高斯。不幸的是,curve_fit返回1,1,1。我對Scipy curve_fit的使用似乎效果不好

Kp4=fnamer4[615:645] 
xk=np.arange(0,1024,1)[615:645] 

def func(x, a, x0, sigma): 
return a*np.exp(-(x-x0)**2/(2*sigma**2)) 
popt, pcov = curve_fit(func, xk, Kp4) 
print (popt) 
Kp4_fit= func(xk, popt[0], popt[1], popt[2]) 
plt.plot(xk, Kp4_fit, 'r',xk, Kp4, 'bs') 

KP4等於

>>> Kp4 
array([23, 27, 20, 26, 22, 22, 26, 29, 32, 19, 34, 26, 29, 24, 32, 41, 27, 
    39, 33, 30, 30, 30, 26, 39, 30, 21, 17, 16, 17, 14]) 

打印POPT的輸出是[ 1. 1. 1.] 我以前也試過很多不同的數據curve_fit,它工作得很好。也許問題是curve_fit不能適應高斯函數的數據?! 感謝您的幫助。

我使用的curve_fit的概念是基於一個例子,從波紋管鏈接: http://python4esac.github.io/fitting/examples1d.html

回答

1

你要通過對POPT初始猜測,否則契合開始[1,1,1]作爲初始猜測,這對你的數據集來說很差!

下面給出了合理的結果對我來說:

popt, pcov = curve_fit(func, xk, Kp4, p0=[20,630,5]) 

初步猜測可能是[np.mean(Kp4), np.mean(xk),5*(max(xk)-min(xk))/len(xk)],有一個總體的出發點。

不要忘記把plt.show()或類似的東西放在最後。

+0

如果答案適用於您,請將其標記爲[如此處所述](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)解決。因此,其他用戶會認識到a)問題已解決,b)解決方案的外觀如何。謝謝! – jkalden 2014-11-24 10:13:34

+0

感謝您的幫助jaklden – icypy 2014-11-24 19:05:50