在Python中将高斯拟合成曲线

时间:2014-01-14 05:43:06

标签: 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(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形高斯? 感谢。

2 个答案:

答案 0 :(得分:2)

你的功能形式是错误的。无论是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()

答案 1 :(得分:1)

也许你可以反转你的值,适合'n'形高斯,然后反转高斯。