使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布

Posted

技术标签:

【中文标题】使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布【英文标题】:Fitting a Weibull distribution in python with stats.exponweib.fit 【发布时间】:2016-06-05 09:44:43 【问题描述】:

我一直在尝试使用 stats.exponweib.fit 拟合 Weibull 分布 - Scipy 中不适合 Weibull,因此,需要利用指数 Weibull 的拟合并将第一个形状参数设置为 1 . 然而,当 stats.exponweib.fit 函数输入来自具有已知形状参数的 Weibull 分布的数据时 - 拟合返回一组不同的形状参数。显示此行为的一些示例代码是:

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 的已知 Weibull 分布的输入数据以及具有不同形状因子的 exponweib.fit 的输出。

Input Weibull data and output from exponweib.fit

关于 *** 的第一篇文章 - 所以,希望以上是提出问题的正确方法。欢迎任何关于上述内容的想法和任何关于发布的建议:)

【问题讨论】:

检查这个(重复?)问题的答案:How to fit a weibull distribution to data using python。在您的情况下,您的 x 变量包含来自原始分布的随机值样本,因此您应该将其传递给 stats.exponweib.fit 感谢 Pablo 的快速回复。完全正确 - 我正在拟合 PDF 而不是样本。是的,在上一个问题中解决了类似的问题:How to fit a weibull distribution to data using python How to fit a weibull distribution to data using python?的可能重复 【参考方案1】:

在我的笔记本中,我尝试了 OpenTURNS 的 WeibullMaxFactory 以在您的 x 上安装 Weibull 分布

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)

获取 Weibull 参数:

print(distribution)
>>> WeibullMax(beta = 0.618739, alpha = 2.85518, gamma = 1.48269)

【讨论】:

【参考方案2】:

Scipy 确实提供了您可以在 Wikipedia 上找到的“标准”Weibull 发行版。你应该使用的函数是scipy.stats.weibull_min

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

【讨论】:

以上是关于使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布的主要内容,如果未能解决你的问题,请参考以下文章

在哪里使用 CORBA 以及在哪里使用 SNMP 进行监控?

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格

在哪里使用 callable 以及在哪里使用 Runnable Interface?

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用

使用 React,在使用 react-transition-group 时,在 StrictMode 中不推荐使用 findDOMNode 作为警告