韦伯分布的定义
本文为博主原创文章,未经博主允许不得转载。
二参数韦伯分布的累计分布函数CDF为: F ( x ) = 1 − e x p [ − ( x b ) a ] F(x) = 1 - exp[ - (\frac{x}{b})^a ] F(x)=1−exp[−(bx)a]
概率密度函数为:
f
(
x
)
=
a
b
(
x
b
)
a
−
1
e
x
p
[
−
(
x
b
)
a
]
f(x) = \frac{a}{b}(\frac{x}{b})^{a-1} exp[-(\frac{x}{b})^a]
f(x)=ba(bx)a−1exp[−(bx)a]
其中,a>0,为形状参数,b>0为尺度参数
拟合方法的原理
采用最小二乘法求解参数a,b:
对累计分布函数两边取双对数后可以得到: l n [ − l n ( 1 − F ( x ) ) ] = a l n ( x ) − a l n b ln[-ln(1-F(x))] = a ln(x) - a lnb ln[−ln(1−F(x))]=aln(x)−alnb
改写为Y=Bx+A,则:
Y = l n [ − l n ( 1 − F ( x ) ) ] Y = ln[-ln(1-F(x))] Y=ln[−ln(1−F(x))]
X = l n ( x ) X = ln(x) X=ln(x)
B = a B = a B=a
A = − a l n b A = -alnb A=−alnb
用最小二乘法求解系数:
B
=
∑
(
X
i
−
X
ˉ
)
(
Y
i
−
Y
ˉ
)
∑
(
X
i
−
X
ˉ
)
2
B = \frac{\sum (X_i - \bar X)(Y_i - \bar Y)}{\sum (X_i - \bar X)^2}
B=∑(Xi−Xˉ)2∑(Xi−Xˉ)(Yi−Yˉ)
A
=
Y
ˉ
−
b
X
ˉ
A = \bar{Y} - b \bar{X}
A=Yˉ−bXˉ
a
=
B
a = B
a=B
b
=
e
x
p
[
−
(
Y
ˉ
−
B
X
ˉ
)
/
a
]
b = exp[-(\bar{Y}-B \bar{X})/a]
b=exp[−(Yˉ−BXˉ)/a]
python代码实现
from scipy.stats import exponweib
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import math
def Cal_Weibull_CDF(data):
cdf = sm.distributions.ECDF(data)
data_min = min(data)
data_max = max(data)
x = np.linspace(data_min+1.0,data_max-1.0,num=100,endpoint=True)
X = np.log(x) # X = ln(x)
Y = np.log(-np.log(1.0-cdf(x))) # Y = ln[-ln[1-F(x)]]
coef = np.polyfit(X,Y,1)
a = coef[0]
b = math.exp(-coef[1]/a)
fcdf = lambda x: 1-np.exp(-np.power(x/b,a))
return fcdf
# 用exponweib生成符合weibull分布的随机数组
n = 100 # number of samples
k = 2.89 # shape
lam = 1.95 # scale
obs = exponweib.rvs(k, lam, scale=20,size=n)
ocdf = sm.distributions.ECDF(obs)
# 拟合
fcdf = Cal_Weibull_CDF(obs)
# 画图
x = np.linspace(0,50,num=100,endpoint=True)
y1 = ocdf(x)
y2 = fcdf(x)
plt.figure()
plt.plot(x,y1,color='blue',label='O')
plt.plot(x,y2,color='black',label='F')
plt.legend()
plt.show()
拟合结果:
参考
- Weibull分布参数估计方法及其应用_张秀芝