2014-11-24 91 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