用Python将高斯曲线拟合到曲线

用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(

我想使用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(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)之间的差值)