Fitting a Weibull distribution using Scipy

前端 未结 7 734
误落风尘
误落风尘 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 09:49

    I had the same problem, but found that setting loc=0 in exponweib.fit primed the pump for the optimization. That was all that was needed from @user333700's answer. I couldn't load your data -- your data link points to an image, not data. So I ran a test on my data instead:

    Plot of distribution fit to problematic (bimodal?) data

    import scipy.stats as ss
    import matplotlib.pyplot as plt
    import numpy as np
    
    N=30
    counts, bins = np.histogram(x, bins=N)
    bin_width = bins[1]-bins[0]
    total_count = float(sum(counts))
    
    f, ax = plt.subplots(1, 1)
    f.suptitle(query_uri)
    
    ax.bar(bins[:-1]+bin_width/2., counts, align='center', width=.85*bin_width)
    ax.grid('on')
    def fit_pdf(x, name='lognorm', color='r'):
        dist = getattr(ss, name)  # params = shape, loc, scale
        # dist = ss.gamma  # 3 params
    
        params = dist.fit(x, loc=0)  # 1-day lag minimum for shipping
        y = dist.pdf(bins, *params)*total_count*bin_width
        sqerror_sum = np.log(sum(ci*(yi - ci)**2. for (ci, yi) in zip(counts, y)))
        ax.plot(bins, y, color, lw=3, alpha=0.6, label='%s   err=%3.2f' % (name, sqerror_sum))
        return y
    
    colors = ['r-', 'g-', 'r:', 'g:']
    
    for name, color in zip(['exponweib', 't', 'gamma'], colors): # 'lognorm', 'erlang', 'chi2', 'weibull_min', 
        y = fit_pdf(x, name=name, color=color)
    
    ax.legend(loc='best', frameon=False)
    plt.show()
    

提交回复
热议问题