2013-07-22 10 views
5

पर गैर-सामान्यीकृत गॉसियन वक्र मेरे पास डेटा है जो हिस्टोग्राम के रूप में प्लॉट करते समय गॉसियन रूप का होता है। मैं हिस्टोग्राम के शीर्ष पर एक गाऊसी वक्र प्लॉट करना चाहता हूं यह देखने के लिए कि डेटा कितना अच्छा है। मैं matplotlib से pyplot का उपयोग कर रहा हूँ। इसके अलावा मैं हिस्टोग्राम को सामान्य बनाना नहीं चाहता हूं। मैं मानदंड फिट कर सकता हूं, लेकिन मैं एक सामान्यीकृत फिट की तलाश में हूं। क्या यहां कोई भी जानता है कि यह कैसे करें?हिस्टोग्राम

धन्यवाद! अभिनव कुमार

+0

क्या यह उदाहरण मदद करता है? http://matplotlib.org/examples/api/histogram_demo.html – DMH

+0

नहीं, इसकी मूल रूप से जो मैं नहीं चाहता हूं। मैं सामान्यीकृत नहीं चाहता। –

उत्तर

6

एक उदाहरण के रूप:

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

यह एक वितरण के लिए एक गाऊसी साजिश समा सकते तो आप pcov का उपयोग कैसे अच्छी तरह से फिट है के लिए एक मात्रात्मक नंबर देना चाहिए।

यह निर्धारित करने का एक बेहतर तरीका है कि आपका डेटा गॉसियन कितना अच्छा है, या कोई वितरण Pearson chi-squared test है। यह समझने के लिए कुछ अभ्यास लेता है लेकिन यह एक बहुत शक्तिशाली उपकरण है।

+0

क्या आप ऊपर दिखाए गए फिट के लिए ए, बी और सी पुनर्प्राप्त कर सकते हैं? मैं यह जांचना चाहता हूं कि मैं क्या उम्मीद करता हूं। –

+0

यह ठीक है 'popt'। आप 'y_fit' प्राप्त करने में ध्यान देंगे, मैंने' f (x_fit, * popt) किया है 'यह 'f' के तर्कों में' popt' के tuple को अनपैक करने का एक चाल है। अधिक के लिए दस्तावेज़ देखें। – Greg

3

ऐसा करने का एक और तरीका है सामान्यीकृत फिट खोजने के लिए और (डेटा का bin_width * कुल लंबाई)

इस अन-सामान्य होगा अपने सामान्य वितरण

4

एक पुरानी पोस्ट मुझे पता है के साथ सामान्य वितरण गुणा करने के लिए है , लेकिन ऐसा करने के लिए मेरा कोड योगदान देना चाहता था, जो बस 'क्षेत्र द्वारा ठीक करें' चाल करता है:

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-') 
संबंधित मुद्दे