Fitting a Weibull distribution using Scipy

前端 未结 7 724
误落风尘
误落风尘 2020-12-04 09:22

I am trying to recreate maximum likelihood distribution fitting, I can already do this in Matlab and R, but now I want to use scipy. In particular, I would like to estimate

相关标签:
7条回答
  • 2020-12-04 10:05

    I was curious about your question and, despite this is not an answer, it compares the Matlab result with your result and with the result using leastsq, which showed the best correlation with the given data:

    enter image description here

    The code is as follows:

    import scipy.stats as s
    import numpy as np
    import matplotlib.pyplot as plt
    import numpy.random as mtrand
    from scipy.integrate import quad
    from scipy.optimize import leastsq
    
    ## my distribution (Inverse Normal with shape parameter mu=1.0)
    def weib(x,n,a):
        return (a / n) * (x / n)**(a-1) * np.exp(-(x/n)**a)
    
    def residuals(p,x,y):
        integral = quad( weib, 0, 16, args=(p[0],p[1]) )[0]
        penalization = abs(1.-integral)*100000
        return y - weib(x, p[0],p[1]) + penalization
    
    #
    data = np.loadtxt("stack_data.csv")
    
    
    x = np.linspace(data.min(), data.max(), 100)
    n, bins, patches = plt.hist(data,bins=x, normed=True)
    binsm = (bins[1:]+bins[:-1])/2
    
    popt, pcov = leastsq(func=residuals, x0=(1.,1.), args=(binsm,n))
    
    loc, scale = 1.58463497, 5.93030013
    plt.plot(binsm,n)
    plt.plot(x, weib(x, loc, scale),
             label='weib matlab, loc=%1.3f, scale=%1.3f' % (loc, scale), lw=4.)
    loc, scale = s.exponweib.fit_loc_scale(data, 1, 1)
    plt.plot(x, weib(x, loc, scale),
             label='weib stack, loc=%1.3f, scale=%1.3f' % (loc, scale), lw=4.)
    plt.plot(x, weib(x,*popt),
             label='weib leastsq, loc=%1.3f, scale=%1.3f' % tuple(popt), lw=4.)
    
    plt.legend(loc='upper right')
    plt.show()
    
    0 讨论(0)
提交回复
热议问题