首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用stats.exponweib.fit拟合python中的威布尔分布

用stats.exponweib.fit拟合python中的威布尔分布
EN

Stack Overflow用户
提问于 2016-02-23 21:57:02
回答 2查看 5K关注 0票数 4

我一直在尝试用stats.exponweib.fit来拟合威布尔分布--在Scipy中并没有一个只适用于威布尔的拟合,因此,人们需要利用指数威布尔的拟合,并将第一个形状参数设置为1。然而,当stats.exponweib.fit函数被馈送来自具有已知形状参数的威布尔分布的数据时,拟合返回一组不同的形状参数。显示此行为的一些示例代码如下:

代码语言:javascript
复制
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)

当我们绘制曲线时:

代码语言:javascript
复制
# 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上的第一篇文章-所以,希望上面是框架问题的正确方式。欢迎对以上内容有任何想法,并在帖子中提出任何建议:)

EN

回答 2

Stack Overflow用户

发布于 2020-10-28 09:06:16

在我的笔记本中,我尝试了OpenTURNS的WeibullMaxFactory来拟合x上的威布尔分布。

代码语言:javascript
复制
import openturns as ot
from openturns.viewer import View
sample = ot.Sample(x, 1) # formats your x into a 'Sample' of dimension = 1
distribution = ot.WeibullMaxFactory().build(sample) # fits a Weibull to your data 
graph = distribution.drawPDF() # build the PDF
graph.setLegends(['Weibull'])
View(graph)

获取威布尔参数的步骤:

代码语言:javascript
复制
print(distribution)
>>> WeibullMax(beta = 0.618739, alpha = 2.85518, gamma = 1.48269)
票数 0
EN

Stack Overflow用户

发布于 2020-11-04 14:18:39

Scipy确实提供了你可以在维基百科上找到的“标准”威布尔分布。您应该为此使用的函数是scipy.stats.weibull_min

Scipy的威布尔实现可能有点令人困惑,它拟合3参数威布尔分布的能力有时会给出狂野的结果。您也无法使用Scipy拟合经过审查的数据。我建议您可以查看Python reliability library,与Scipy相比,它使得创建、拟合和使用概率分布的过程相当简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35579505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档