我对Scipy curve_fit的使用似乎不太好用

时间:2014-11-24 04:39:18

标签: python numpy scipy curve-fitting gaussian

我正在尝试使用Scipy curve_fit将我的数据拟合为高斯。不幸的是,curve_fit返回1,1,1。

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

print popt的输出为[ 1. 1. 1.] 我以前在很多不同的数据上尝试过curve_fit,它运行良好。也许问题是curve_fit无法拟合高斯函数的数据?! 谢谢你的帮助。

我用于curve_fit的概念基于以下链接的示例: http://python4esac.github.io/fitting/examples1d.html

1 个答案:

答案 0 :(得分: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()或类似内容。