在python中拟合Weibull分布stats.exponweib.fi

2024-10-03 02:47:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图拟合威布尔分布stats.exponweib.fit-对于Weibull没有一个适合的Scipy,因此,需要利用指数Weibull的拟合,并将第一个形状参数设置为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)

当我们绘制曲线时:

^{pr2}$

我们得到以下曲线,显示了形状因子k=5和lambda=1的已知Weibull分布的输入数据和exponweib.fit公司不同的形状因素。在

Input Weibull data and output from exponweib.fit

第一篇关于stackoverflow的帖子-所以,希望上面的文章是正确的方式来提出一个问题。欢迎您对以上内容有任何想法和建议:)


Tags: thefromimportalphareturndefstatsrandom