[英]How can I fit a gaussian curve in python?
我得到了一个数组,当我绘制它时,我得到一个带有一些噪音的高斯形状。 我想适合高斯。 这是我已经拥有的,但是当我绘制它时,我没有得到拟合的高斯,而是得到一条直线。 我已经尝试了很多不同的方法,但我就是想不通。
random_sample=norm.rvs(h)
parameters = norm.fit(h)
fitted_pdf = norm.pdf(f, loc = parameters[0], scale = parameters[1])
normal_pdf = norm.pdf(f)
plt.plot(f,fitted_pdf,"green")
plt.plot(f, normal_pdf, "red")
plt.plot(f,h)
plt.show()
您可以使用scipy.stats.norm
中的fit
,如下所示:
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
data = np.random.normal(loc=5.0, scale=2.0, size=1000)
mean,std=norm.fit(data)
norm.fit
尝试根据数据拟合正态分布的参数。 事实上,在上面的例子中, mean
大约是 5, std
大约是 2。
为了绘制它,您可以执行以下操作:
plt.hist(data, bins=30, density=True)
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
y = norm.pdf(x, mean, std)
plt.plot(x, y)
plt.show()
蓝色框是数据的直方图,绿线是带有拟合参数的高斯。
有很多方法可以将高斯函数拟合到数据集。 我在拟合数据时经常使用 astropy,这就是为什么我想将其添加为附加答案。
我使用了一些应该模拟带有一些噪声的高斯的数据集:
import numpy as np
from astropy import modeling
m = modeling.models.Gaussian1D(amplitude=10, mean=30, stddev=5)
x = np.linspace(0, 100, 2000)
data = m(x)
data = data + np.sqrt(data) * np.random.random(x.size) - 0.5
data -= data.min()
plt.plot(x, data)
然后拟合它实际上非常简单,您指定一个要拟合数据的模型和一个拟合器:
fitter = modeling.fitting.LevMarLSQFitter()
model = modeling.models.Gaussian1D() # depending on the data you need to give some initial values
fitted_model = fitter(model, x, data)
并绘制:
plt.plot(x, data)
plt.plot(x, fitted_model(x))
但是,您也可以只使用 Scipy,但您必须自己定义函数:
from scipy import optimize
def gaussian(x, amplitude, mean, stddev):
return amplitude * np.exp(-((x - mean) / 4 / stddev)**2)
popt, _ = optimize.curve_fit(gaussian, x, data)
这将返回适合的最佳参数,您可以像这样绘制它:
plt.plot(x, data)
plt.plot(x, gaussian(x, *popt))
您还可以使用scipy.optimize()中的curve_fit来拟合高斯函数,您可以在其中定义自己的自定义函数。 在这里,我举一个高斯曲线拟合的例子。 例如,如果您有两个数组x
和y
。
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
x = ar(range(10))
y = ar([0,1,2,3,4,5,4,3,2,1])
n = len(x) #the number of data
mean = sum(x*y)/n #note this correction
sigma = 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=[1,mean,sigma])
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
需要使用三个参数调用curve_fit函数:您想要拟合的函数(在本例中为gaus()),自变量的值(在我们的例子中为x),以及从属变量的值(在我们的案例y)。 curve_fit功能比返回具有最佳参数(在最小二乘意义上)的数组和包含最佳参数的协方差的第二个数组(稍后更多)。
以下是拟合的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.