【问题标题】:How can I fit a gaussian curve in python?如何在 python 中拟合高斯曲线?
【发布时间】:2017-11-12 18:58:27
【问题描述】:

我得到了一个数组,当我绘制它时,我得到一个带有一些噪音的高斯形状。我想拟合高斯。这是我已经拥有的,但是当我绘制它时,我没有得到拟合的高斯,而是得到一条直线。我已经尝试了很多不同的方法,但我就是想不通。

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

【问题讨论】:

标签: python scipy curve-fitting gaussian


【解决方案1】:

您可以从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()

蓝色框是您数据的直方图,绿线是带有拟合参数的高斯。

【讨论】:

    【解决方案2】:

    有很多方法可以将高斯函数拟合到数据集。我在拟合数据时经常使用 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))
    

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2021-10-14
      • 1970-01-01
      • 2012-06-12
      • 2020-12-14
      • 2014-04-27
      • 2022-01-26
      • 2018-07-23
      • 2022-01-02
      相关资源
      最近更新 更多