Fit a gaussian function

后端 未结 4 472
天命终不由人
天命终不由人 2020-11-30 02:20

I have a histogram (see below) and I am trying to find the mean and standard deviation along with code which fits a curve to my histogram. I think there is something in SciP

相关标签:
4条回答
  • 2020-11-30 02:20

    Take a look at this answer for fitting arbitrary curves to data. Basically you can use scipy.optimize.curve_fit to fit any function you want to your data. The code below shows how you can fit a Gaussian to some random data (credit to this SciPy-User mailing list post).

    import numpy
    from scipy.optimize import curve_fit
    import matplotlib.pyplot as plt
    
    # Define some test data which is close to Gaussian
    data = numpy.random.normal(size=10000)
    
    hist, bin_edges = numpy.histogram(data, density=True)
    bin_centres = (bin_edges[:-1] + bin_edges[1:])/2
    
    # Define model function to be used to fit to the data above:
    def gauss(x, *p):
        A, mu, sigma = p
        return A*numpy.exp(-(x-mu)**2/(2.*sigma**2))
    
    # p0 is the initial guess for the fitting coefficients (A, mu and sigma above)
    p0 = [1., 0., 1.]
    
    coeff, var_matrix = curve_fit(gauss, bin_centres, hist, p0=p0)
    
    # Get the fitted curve
    hist_fit = gauss(bin_centres, *coeff)
    
    plt.plot(bin_centres, hist, label='Test data')
    plt.plot(bin_centres, hist_fit, label='Fitted data')
    
    # Finally, lets get the fitting parameters, i.e. the mean and standard deviation:
    print 'Fitted mean = ', coeff[1]
    print 'Fitted standard deviation = ', coeff[2]
    
    plt.show()
    
    0 讨论(0)
  • 2020-11-30 02:28

    You can try sklearn gaussian mixture model estimation as below :

    import numpy as np
    import sklearn.mixture
    
    gmm = sklearn.mixture.GMM()
    
    # sample data
    a = np.random.randn(1000)
    
    # result
    r = gmm.fit(a[:, np.newaxis]) # GMM requires 2D data as of sklearn version 0.16
    print("mean : %f, var : %f" % (r.means_[0, 0], r.covars_[0, 0]))
    

    Reference : http://scikit-learn.org/stable/modules/mixture.html#mixture

    Note that in this way, you don't need to estimate your sample distribution with an histogram.

    0 讨论(0)
  • 2020-11-30 02:30

    Kind of an old question, but for anybody looking just to plot a density fit for a series, you could try matplotlib's .plot(kind='kde'). Docs here.

    Example with pandas:

    mydf.x.plot(kind='kde')
    
    0 讨论(0)
  • 2020-11-30 02:39

    I am not sure what your input is, but possibly your y-axis scale is too large (20000), try reducing this number. The following code works for me:

    import matplotlib.pyplot as plt
    import numpy as np
    
    #created my variable
    v = np.random.normal(0,1,1000)
    
    
    fig, ax = plt.subplots()
    
    
    plt.hist(v, bins=500, normed=1, color='#7F38EC', histtype='step')
    
    #plot
    plt.title("Gaussian")
    plt.axis([-1, 2, 0, 1]) #changed 20000 to 1
    
    plt.show()
    

    Edit:

    If you want the actual count of values on y-axis, you can set normed=0. And would just get rid of the plt.axis([-1, 2, 0, 1]).

    import matplotlib.pyplot as plt
    import numpy as np
    
    #function
    v = np.random.normal(0,1,500000)
    
    
    fig, ax = plt.subplots()
    
    # changed normed=1 to normed=0
    plt.hist(v, bins=500, normed=0, color='#7F38EC', histtype='step')
    
    #plot
    plt.title("Gaussian")
    #plt.axis([-1, 2, 0, 20000]) 
    
    plt.show()
    
    0 讨论(0)
提交回复
热议问题