高斯拟合直方图是平坦的

时间:2017-09-08 20:37:47

标签: python curve-fitting gaussian

我创建了一个python脚本,它从文件中绘制一行数据,然后用高斯曲线拟合它。红色步骤直方图是一组数据,其平均值我想与实际数据值(蓝色虚线)进行比较。高斯拟合在图的底部几乎看不到,它是一条绿色虚线。我无法找出为什么拟合是平的而不是曲线,因为计算的均值和西格玛是正确的;它们是图表的标题。

Graph

我的源代码

    from scipy.stats import norm
    import scipy, pylab
    import numpy as np
    import matplotlib.pyplot as plt


    df = numpy.loadtxt('CR_count_TAL=0.10472.dat',dtype='str')

    for num in range(1):
        nu=df[num].astype('float')
        data = nu[1]
        mc=df[2:numpy.size(nu)]
        #plot the MC distribution
        #hist(nu[2:size(nu)],bins=100,color='r',range=(100,500),histtype='step')

        #plot the dataline
        axvline(data,color='b',linewidth=2, linestyle='--')
        #fit a gaussian
        #(mu, sigma) = norm.fit(nu)
        plt.hist(nu[2:size(nu)],bins=100,color='r',range=(100,500),histtype='step')
        y = mlab.normpdf(bins, mu, sigma)
        l = plt.plot(bins, y, 'g', linewidth = 2, linestyle='--')

        plt.title(r'$\ \mu=%.3f,\ \sigma=%.3f$' %(mu, sigma))
        plt.show()

1 个答案:

答案 0 :(得分:4)

请在此处查看完整的工作示例,并根据您的代码进行调整

<add name ="FilterModule" type="FilterModule.AuthorizeLocal" />

它给出了这张照片

enter image description here

问题是您的import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab mu = 100 sigma = 20 n_sample = 3000 data = np.random.normal(mu, sigma, n_sample) # plot the data _, bins, _ = plt.hist(data, bins=100, color='r', range=(50, 150), histtype='step', normed=True) # plot the gaussian PDF y = mlab.normpdf(bins, mu, sigma) plt.plot(bins, y, 'g', linewidth=2, linestyle='--') plt.axvline(mu, color='b', linewidth=2, linestyle='--') plt.title(r'$\ \mu=%.3f,\ \sigma=%.3f$' % (mu, sigma)) plt.show() 是一个概率分布,规范化为1,但您的直方图不是。因此,有两种方法可以解决它:

  • 缩放PDF
  • 归一化直方图

归一化基本上是直方图曲线下的面积,可以通过数值积分计算。受

的影响
  • 样本数
  • bin size

请注意,y可以通过传递plt.hist选项为您执行此操作。