PythonⅡ中高斯曲线的拟合
我有两张单子PythonⅡ中高斯曲线的拟合,python,scipy,Python,Scipy,我有两张单子 import numpy x = numpy.array([7250, ... list of 600 ints ... ,7849]) y = numpy.array([2.4*10**-16, ... list of 600 floats ... , 4.3*10**-16]) 它们呈U形曲线。 现在我想拟合高斯曲线 from scipy.optimize import curve_fit n = len(x) mean = sum(y)/n sigma = sum(y -
import numpy
x = numpy.array([7250, ... list of 600 ints ... ,7849])
y = numpy.array([2.4*10**-16, ... list of 600 floats ... , 4.3*10**-16])
它们呈U形曲线。
现在我想拟合高斯曲线
from scipy.optimize import curve_fit
n = len(x)
mean = sum(y)/n
sigma = sum(y - mean)**2/n
def gaus(x,a,x0,sigma,c):
return a*numpy.exp(-(x-x0)**2/(2*sigma**2))+c
popt, pcov = curve_fit(gaus,x,y,p0=[-1,mean,sigma,-5])
pylab.plot(x,y,'r-')
pylab.plot(x,gaus(x,*popt),'k-')
pylab.show()
我只是以嘈杂的原始U形曲线和一条穿过曲线的水平直线结束
我不确定-1和-5在上面的代码中代表什么,但我确定我需要调整它们或其他东西来获得高斯曲线。我一直在玩弄可能的价值观,但没有用
有什么想法吗?p0在调用曲线拟合时,除了x之外,还对函数的其他参数进行了初步猜测。在上面的代码中,你是说我希望曲线拟合函数使用-1作为a的初始猜测,-5作为c的初始猜测,mean作为x0的初始猜测,sigma作为sigma的猜测。然后,“曲线拟合”功能将调整这些参数,以尝试获得更好的拟合。问题是,如果给定(x,y)s的阶数,您对函数参数的初始猜测非常糟糕 考虑一下高斯分布的不同参数的数量级。a应该在y值的大小(10**-16)左右,因为在高斯曲线的峰值,指数部分永远不会大于1。x0将给出x值内高斯指数部分为1的位置,因此x0应该在7500左右,可能在数据中心的某个位置。Sigma表示高斯分布的宽度,所以也许100中的某个值只是一个猜测。最后,c只是一个偏移量,用来上下移动整个高斯分布 我建议做的是,在拟合曲线之前,为a、x0、sigma和c选择一些合理的值,并用高斯曲线绘制数据,然后使用a、x0、sigma和c,直到得到一些看起来至少与高斯曲线拟合方式相同的值,然后将其用作曲线拟合p0值的起点。我给你的价值观应该让你开始,但可能不完全是你想要的。例如,如果要翻转高斯曲线以获得“U”形,a可能需要为负数 此外,打印出curve_fit认为对a、x0、sigma和c有益的值,可能有助于您了解它在做什么,以及该函数是否在正确的轨道上,以最小化拟合的剩余 我在使用gnuplot进行曲线拟合时也遇到过类似的问题,如果初始值与您想要拟合的值相差太远,那么使用参数将残差减到最小,可能会出现完全错误的方向,您可以通过肉眼做得更好。可以将这些函数看作是通过肉眼对这些参数的估计进行微调的一种方法
希望这有助于p0在调用曲线拟合时,除了x之外,还可以对函数的其他参数进行初步猜测。在上面的代码中,你是说我希望曲线拟合函数使用-1作为a的初始猜测,-5作为c的初始猜测,mean作为x0的初始猜测,sigma作为sigma的猜测。然后,“曲线拟合”功能将调整这些参数,以尝试获得更好的拟合。问题是,如果给定(x,y)s的阶数,您对函数参数的初始猜测非常糟糕 考虑一下高斯分布的不同参数的数量级。a应该在y值的大小(10**-16)左右,因为在高斯曲线的峰值,指数部分永远不会大于1。x0将给出x值内高斯指数部分为1的位置,因此x0应该在7500左右,可能在数据中心的某个位置。Sigma表示高斯分布的宽度,所以也许100中的某个值只是一个猜测。最后,c只是一个偏移量,用来上下移动整个高斯分布 我建议做的是,在拟合曲线之前,为a、x0、sigma和c选择一些合理的值,并用高斯曲线绘制数据,然后使用a、x0、sigma和c,直到得到一些看起来至少与高斯曲线拟合方式相同的值,然后将其用作曲线拟合p0值的起点。我给你的价值观应该让你开始,但可能不完全是你想要的。例如,如果要翻转高斯曲线以获得“U”形,a可能需要为负数 此外,打印出curve_fit认为对a、x0、sigma和c有益的值,可能有助于您了解它在做什么,以及该函数是否在正确的轨道上,以最小化拟合的剩余 我在使用gnuplot进行曲线拟合时也遇到过类似的问题,如果初始值与您想要拟合的值相差太远,那么使用参数将残差减到最小,可能会出现完全错误的方向,您可以通过肉眼做得更好。可以将这些函数看作是通过肉眼对这些参数的估计进行微调的一种方法
希望这对你有所帮助首先,你的变量西格玛实际上是方差,即西格玛平方。 这会给曲线拟合一个次优的起始估计值,从而混淆曲线拟合 然后,你的拟合安萨兹,
gaus
,包括一个振幅a
和一个偏移量,这是你真正需要的吗?起始值为a=-1
(否定钟形)和偏移量c=-5
。他们来自哪里
下面是我要做的:
- 修正你的模型。你想要一个高斯函数吗,它需要归一化吗。如果是,则振幅
由a
等固定sigma
- 看看实际数据。尾巴是什么(偏移),符号是什么(振幅符号)
曲线拟合
:高斯分布完全由两个第一时刻定义,平均值
和西格玛
。按照您所做的方式计算它们,在数据上绘制它们,然后查看
x = numpy.array([7250, ... list of 600 ints ... ,7849])
y = numpy.array([2.4*10**-16, ... list of 600 floats ... , 4.3*10**-16])
n = len(x)
mean = sum(x)/n
sigma = math.sqrt(sum((x-mean)**2)/n)
def gaus(x,a,x0,sigma,c):
return a*numpy.exp(-(x-x0)**2/(2*sigma**2))+c
popy, pcov = curve_fit(gaus,x,y,p0=[-max(y),mean,sigma,min(x)+((max(x)-min(x)))/2])
pylab.plot(x,gaus(x,*popt))
x = numpy.array([7250, ... list of 600 ints ... ,7849])
y = numpy.array([2.4*10**-16, ... list of 600 floats ... , 4.3*10**-16])
n = len(x)
mean = sum(x*y)/sum(y)
sigma = sqrt(abs(sum((x-mean)**2*y)/sum(y)))
def gaus(x,a,x0,sigma,c):
return a*numpy.exp(-(x-x0)**2/(2*sigma**2))+c
popy, pcov = curve_fit(gaus,x,y,p0=[-max(y),mean,sigma,min(x)+((max(x)-min(x)))/2])
pylab.plot(x,gaus(x,*popt))