簡體   English   中英

高斯擬合直方圖是平坦的

[英]Gaussian fit to histogram is flat

我創建了一個python腳本,該腳本繪制了文件中的一行數據,然后將其與高斯曲線擬合。 紅色步進直方圖是一組數據,我希望將其平均值與真實數據值(藍色虛線)進行比較。 高斯擬合在圖的底部幾乎看不到,它是一條虛線綠色。 由於計算出的均值和sigma是正確的,所以我無法找出擬合為何平坦而不是曲線的原因。 它們是圖形的標題。

圖形

我的源代碼

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

請在此處查看根據您的代碼改編的完整示例

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

它給這張照片

在此處輸入圖片說明

問題在於,您的y是歸一化為1的概率分布,而您的直方圖則不是。 因此,有兩種處理方法:

  • 縮放PDF
  • 標准化直方圖

歸一化基本上是直方圖曲線下的面積,可以通過數值積分來計算。 受以下因素影響

  • 樣品數
  • 箱尺寸

請注意, plt.hist可以通過傳遞plt.hist normed=True選項來為您完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM