用Python将高斯曲线拟合到曲线
我想使用python将高斯曲线拟合到曲线。我在这里的某个地方找到了一个解决方案,但它似乎只适用于n形高斯,而不适用于u形高斯 代码如下:用Python将高斯曲线拟合到曲线,python,Python,我想使用python将高斯曲线拟合到曲线。我在这里的某个地方找到了一个解决方案,但它似乎只适用于n形高斯,而不适用于u形高斯 代码如下: import pylab, numpy from scipy.optimize import curve_fit x=numpy.array(range(10)) y=numpy.array([0,1,2,3,4,5,4,3,2,1]) n=len(x) mean=sum(y)/n sigma=sum(y-mean)**2/n def gaus(
import pylab, numpy
from scipy.optimize import curve_fit
x=numpy.array(range(10))
y=numpy.array([0,1,2,3,4,5,4,3,2,1])
n=len(x)
mean=sum(y)/n
sigma=sum(y-mean)**2/n
def gaus(x,a,x0,sigma):
return a*numpy.exp(-(x-x0)**2/(2*sigma**2))
popt, pcov=curve_fit(gaus,x,y,p0=[1,mean,sigma])
pylab.plot(x,y,'r-',x,y,'ro')
pylab.plot(x,gaus(x,*popt),'k-',x,gaus(x,*popt),'ko')
pylab.show()
代码将高斯曲线拟合为n形曲线,但如果我将y更改为y=numpy.array([5,4,3,2,1,2,3,4,5,6]),则返回一些错误:未找到最佳参数:函数调用数已达到maxfev=800
我需要在代码中更改/调整什么以适应U形高斯曲线?
谢谢。也许你可以反转你的值,拟合一个“n”型高斯,然后反转高斯。也许你可以反转你的值,拟合一个“n”型高斯,然后反转高斯。拟合的函数形式是错误的。无论是n形还是u形,高斯分布的尾部都会变为0,但你的尾部会变为~5 如果在等式中引入一个偏移量,并选择合理的初始值,那么它是有效的。见下面的代码:
import pylab, numpy
from scipy.optimize import curve_fit
x=numpy.array(range(10))
y=numpy.array([5,4,3,2,1,2,3,4,5,6])
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-',x,y,'ro')
pylab.plot(x,gaus(x,*popt),'k-',x,gaus(x,*popt),'ko')
pylab.show()
你的贴合感的功能形式是错误的。无论是n形还是u形,高斯分布的尾部都会变为0,但你的尾部会变为~5 如果在等式中引入一个偏移量,并选择合理的初始值,那么它是有效的。见下面的代码:
import pylab, numpy
from scipy.optimize import curve_fit
x=numpy.array(range(10))
y=numpy.array([5,4,3,2,1,2,3,4,5,6])
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-',x,y,'ro')
pylab.plot(x,gaus(x,*popt),'k-',x,gaus(x,*popt),'ko')
pylab.show()
你确定这是你的实际代码吗?当我运行这个程序时,由于被0除,我得到一个
RuntimeWarning
,因为sigma
是0(你可能想要numpy.sqrt(sum((y-means)**2)/n)
,如果这是一个标准偏差)。Hi senshin。以上是我的实际代码。它适用于n形。你确定这是你的实际代码吗?当我运行这个程序时,由于被0除,我得到一个RuntimeWarning
,因为sigma
是0(你可能想要numpy.sqrt(sum((y-means)**2)/n)
,如果这是一个标准偏差)。Hi senshin。以上是我的实际代码。它适用于n型。谢谢Madison May。我想到了,但不知道如何调整代码。谢谢麦迪逊·梅。我想到了这一点,但不确定如何调整代码。我现在正尝试将U形高斯拟合到一条曲线,最小(x)=7250,最大(x)=7849,最小(y)=2.4*10^-16,最大(y)=4.3*10^-16,我一直在使用c常量的值,但最终得到的是一条直线。在这种情况下,我应该使用什么?对于c
,如果它是u形,则需要-max(y)
附近的东西。然而,问题很可能是对a
的初始猜测,它远大于高斯分布的振幅。尝试设置a~=-2E-16
(负数表示u形高斯,而a
的大小约为最小值(y)和最大值(y)之间的差值))我现在尝试将u形高斯拟合到一条曲线,最小值(x)=7250,最大值(x)=7849,最小值(y)=2.4*10^-16,最大值(y)=4.3*10^-16我一直在用c常量的值来计算,但我最后得到的是一条直线。在这种情况下,我应该使用什么?对于c
,如果它是u形,则需要-max(y)
附近的东西。然而,问题很可能是对a
的初始猜测,它远大于高斯分布的振幅。尝试设置a~=-2E-16
(负数表示u形高斯,而a
的大小约为最小值(y)和最大值(y)之间的差值)