我一直在尝试用stats.exponweib.fit来拟合威布尔分布--在Scipy中并没有一个只适用于威布尔的拟合,因此,人们需要利用指数威布尔的拟合,并将第一个形状参数设置为1。然而,当stats.exponweib.fit函数被馈送来自具有已知形状参数的威布尔分布的数据时,拟合返回一组不同的形状参数。显示此行为的一些示例代码如下:
from numpy import random, exp, log import matplotlib.pyplot as plt from scipy import stats import csv # Expoential Weibull PDF def expweibPDF(x, k, lam, alpha): return (alpha * (k/lam) * ((x/lam)**(k-1)) * ((1 - exp(-(x/lam)**k))**(alpha-1)) * exp(-(x/lam)**k)) # Expoential Weibull CDF def exp_cdf(x, k, lam, alpha): return (1 - exp(-(x / lam)**k))**alpha # Expoential Weibull Inverse CDF def exp_inv_cdf(p, k, lam, alpha): return lam * ( - log( (1 - p)**(1/alpha) ))**(1/k) # parameters for the fit - alpha = 1.0 reduces to normal Webull # the shape parameters k = 5.0 and lam = 1.0 are demonstrated on Wikipedia: # https://en.wikipedia.org/wiki/Weibull_distribution alpha = 1.0 k0 = 5.0 lam0 = 1.0 x = [] y = [] # create a Weibull distribution random.seed(123) n = 1000 for i in range(1,n) : p = random.random() x0 = exp_inv_cdf(p,k0,lam0,alpha) x += [ x0 ] y += [ expweibPDF(x0,k0,lam0,alpha) ] # now fit the Weibull using python library # setting f0=1 should set alpha = 1.0 # so, shape parameters should be the k0 = 5.0 and lam = 1.0 (exp1, k1, loc1, lam1) = stats.exponweib.fit(y,floc=0, f0=1) print (exp1, k1, loc1, lam1)
这里的输出是:
(1,2.8146777019890856,0,1.4974049126907345)
我本以为:
(1,5.0,0,1.0)
当我们绘制曲线时:
# plotting the two curves fig, ax = plt.subplots(2, 1) ax[0].plot(x,y, 'ro', lw=2) ax[1].plot(x,stats.exponweib.pdf(x,exp1,k1,loc1,lam1), 'ro', lw=2) plt.show()
我们得到以下曲线,显示了具有形状因子k=5和lambda=1的已知威布尔分布的输入数据,以及具有不同形状因子的exponweib.fit的输出数据。
Input Weibull data and output from exponweib.fit
stackoverflow上的第一篇文章-所以,希望上面是框架问题的正确方式。欢迎对以上内容有任何想法,并在帖子中提出任何建议:)
发布于 2020-10-28 09:06:16
在我的笔记本中,我尝试了 OpenTURNS 的WeibullMaxFactory来拟合x上的威布尔分布。
import openturns as ot from openturns.viewer import View