2013-07-22 41 views
5

ile Gaussian Un-normalleştirilmiş. Verilerin ne kadar iyi olduğunu görmek için histogramın üstünde bir gauss eğrisi çizmek istiyorum. Matplotlib'den pyplot kullanıyorum. Ayrıca histogramı normalleştirmek istemiyorum. Norm uyumu yapabilirim, ama normalleştirilmemiş bir uyum için arıyorum. Burada kimse nasıl yapılacağını biliyor mu?bir histogram olarak işaretlendiğinde Gauss formunun olan veri histogram

Teşekkürler! Abhinav Kumar Örnek olarak

+0

bu örnek yardımcı olur mu: ama basitçe 'düzeltmek alana göre' hüner yok ki, bu iş için kodumu katkı istedi? http://matplotlib.org/examples/api/histogram_demo.html – DMH

+0

Hayır, onun temelde ben seyleri istiyorum. Normalize edilmeyi istemiyorum. –

cevap

6

: Bu dağılımına bir Gauss arsa uyacak

import pylab as py 
import numpy as np 
from scipy import optimize 

# Generate a 
y = np.random.standard_normal(10000) 
data = py.hist(y, bins = 100) 

# Equation for Gaussian 
def f(x, a, b, c): 
    return a * py.exp(-(x - b)**2.0/(2 * c**2)) 

# Generate data from bins as a set of points 
x = [0.5 * (data[1][i] + data[1][i+1]) for i in xrange(len(data[1])-1)] 
y = data[0] 

popt, pcov = optimize.curve_fit(f, x, y) 

x_fit = py.linspace(x[0], x[-1], 100) 
y_fit = f(x_fit, *popt) 

plot(x_fit, y_fit, lw=4, color="r") 

enter image description here

, size uygun ne kadar iyi bir nicel numarası vermek üzere pcov kullanmalıdır.

daha iyi bir yolu

veri Gaussian'dır veya herhangi dağıtım Pearson chi-squared test olduğunu nasıl çalıştığını belirlemek için. Anlamak için biraz pratik gerekir ama çok güçlü bir araçtır.

+0

biz yukarıda göstermek oturması için a, b ve c almak miyim? Ne olmasını beklediğimi kontrol etmek istiyorum. –

+0

Bu tam 'popt' olduğunu. Sen 'Yaptığım y_fit'' f (x_fit, * popt) almakla göreceksiniz 'Bu f'' argümanları içine popt' 'ait tuple açmak için bir hile. Daha fazla bilgi için dokümanlar. – Greg

3

Bunu yapmanın bir başka yolu normalize uygun bulmak ve (veri bin_width * toplam uzunluğu)

bu-un normalleştirmek olacak normal dağılım

4

bildiğim eski bir yazı ile normal dağılım çarpmak etmektir

from scipy.stats import norm 
from numpy import linspace 
from pylab import plot,show,hist 

def PlotHistNorm(data, log=False): 
    # distribution fitting 
    param = norm.fit(data) 
    mean = param[0] 
    sd = param[1] 

    #Set large limits 
    xlims = [-6*sd+mean, 6*sd+mean] 

    #Plot histogram 
    histdata = hist(data,bins=12,alpha=.3,log=log) 

    #Generate X points 
    x = linspace(xlims[0],xlims[1],500) 

    #Get Y points via Normal PDF with fitted parameters 
    pdf_fitted = norm.pdf(x,loc=mean,scale=sd) 

    #Get histogram data, in this case bin edges 
    xh = [0.5 * (histdata[1][r] + histdata[1][r+1]) for r in xrange(len(histdata[1])-1)] 

    #Get bin width from this 
    binwidth = (max(xh) - min(xh))/len(histdata[1])   

    #Scale the fitted PDF by area of the histogram 
    pdf_fitted = pdf_fitted * (len(data) * binwidth) 

    #Plot PDF 
    plot(x,pdf_fitted,'r-')