我在第一个象限中有一组点看起来像高斯分布,我试图用python中的高斯函数拟合它,我的代码如下:
import pylab as plb
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
import math
x=ar([37,69,157,238,274,319,391,495,533,626,1366,1855,2821,3615,4130,4374,6453,6863,7021,
7951,8646,9656,10464,11400])
y=ar([1.77,1.67,1.65,1.17,1.34,1.46,0.75,1,0.8,1.02,0.65,0.69,0.44,0.44,0.55,0.43,0.75,0.27,0.26,
0.44,0.04,0.44,0.26,0.04])
n = 24 #the number of data
mean = sum(x*y)/n #note this correction
sigma = math.sqrt(sum(y*(x-mean)**2)/n) #note this correction
def gaus(x,a,x0,sigma):
return a*exp(-(x-x0)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,x,y,p0=None, sigma=None) #'''p0=[1,mean,sigma]'''
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit for Time Constant')
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.show()
结果是:这个数字: http://s2.postimg.org/wevggkc95/Workspace_1_022.png
为什么所有的红点都在下面,还请注意,我对半高斯的数据感兴趣,因为我的数据是这样的,所以我的y值一开始很大,然后像高斯钟形的一侧一样减小。有谁能告诉我如何在python中拟合这条曲线(万一它不能拟合高斯曲线)。或者换句话说,我希望代码适合我的点的一半(左侧)高斯分布(仅在第一象限)。请注意,我的点不能像我之前尝试的那样拟合成指数递减曲线,并且它在较低的“x”值下拟合得不好。在
显然,你的数据不适合或不容易符合高斯函数。您使用}的值)。您可以尝试更好的猜测(例如
p0 = [1,1,1]
的默认初始猜测,这与curve_fit
在开始之前放弃的任何一种最佳选择相差甚远(请检查popt=[1,1,1]
和{p0 = [2,0, 2000]
),但在我的系统中,它不会收敛:Optimal parameters not found: Number of calls to function has reached maxfev = 800.
要拟合“半高斯”,请不要使中心位置
x0
浮动(只需使其等于0):除非您有特殊的理由想要拟合高斯函数,为什么不将更稳健的线性最小二乘法拟合到多项式上,例如:
^{pr2}$相关问题 更多 >
编程相关推荐