Censored Weibull Distribution 最大似然估計 (結合牛頓法求解)

Censored Weibull Distribution 最大似然估計 (結合牛頓法求解)

前言:寫這篇博客是因爲我前幾天偶然讀到一篇很有意思的文章, 然後想用自己的實驗數據測試一下其分佈情況,本以外是一個很簡單的工作,但再簡單的工作也需要不斷的更新學習。在學習過程中,我發現已經有很多博文詳述了Weibull分佈的應用和意義,然而對於如何進行參數估計的問題,卻缺乏更加詳細的記錄文檔。於是無聊而又不務正業的Shecan稍微探索了一下,並把筆記分享給大家。如有錯誤或者疑問,請給Shecan留言。

Weibull 分佈函數 CDF:
F(x)=1e(xβ)α(1) F(x) = 1 - e^{-(\frac{x}{\beta})^{\alpha}}\tag{1}
這裏 β\beta 表示 Scale Parameter, α\alpha 表示 Shape Parameter。

分佈密度 PDF:
f(x)=αxγαeγα(2) f\left( x\right) =\frac {\alpha } {x}\gamma ^{\alpha }e^{-\gamma ^{\alpha}}\tag{2}
其中
γ=xβ \gamma = \frac{x}{\beta}
censored 似然函數的定義:
L=i=1n(f(xi))δi(1F(xi))1δi(3) L=\prod _{i=1}^{n}\left( f\left( x_i\right) \right) ^{\delta_i}\left( 1-F\left( x_{i}\right) \right) ^{1-\delta_{i}}\tag{3}
其中
δi={1,xthreshold0,x>threshold \delta _{i}=\begin{cases} 1,\,x\leq threshold\\ 0,\,x>threshold\end{cases}
把(1),(2)帶入(3)兩邊求對數,並簡化求得對數似然函數:
1ogL=i=1n(γiα+δiαlnγi+δlnαxi)(4) 1og_L=\sum _{i=1}^{n}\left( - \gamma _{i}^{\alpha }+\delta_{i}\alpha ln\gamma _{i}+\delta\ln \frac {\alpha } {x_{i}}\right)\tag{4}
其中α\alphaβ\beta, 可以通過最大化似然函數求得,對(4)求一階導數
i=1nγiαδi=0,(5) \sum_{i=1}^{n}\gamma_i^\alpha-\delta_i=0,\tag{5}
i=1n(γiαlnγi+δilnγi+δiα)=0.(6) \sum _{i=1}^{n}\left( -\gamma _{i}^{\alpha }\ln \gamma _{i}+\delta_i\ln \gamma _{i}+\frac {\delta_i} {\alpha }\right) =0.\tag{6}
(5),(6)是關於α,β\alpha,\,\beta 的外生解,無法求出其解析解,因而需要求解以上兩個非線性方程組的數值解。求解非線性方程組數值解的方法有很多,比如非線性最小二乘法,Broyden方法等等,但是我們遵循簡單即有效的原則,嘗試最爲簡單的Newton-Rapson解的搜索方法。首先,簡化(5)得
β=(inxiαinδi)1α(7) \beta =\left( \frac {\sum_{i}^{n}x_{i}^{\alpha }} {\sum_{i}^{n}\delta_{i}}\right) ^{\frac {1} {\alpha }}\tag{7}
因此,我們只需要通過(6)求解 α\alpha, 假設
h(α)=i=1n(γiαlnγi+δilnγi+δiα)(8) h(\alpha)=\sum _{i=1}^{n}\left( -\gamma _{i}^{\alpha }\ln \gamma _{i}+\delta_i\ln \gamma _{i}+\frac {\delta_i} {\alpha }\right)\tag{8}
其中
γi=xiβ=xi(xiαn)1α \gamma _{i}=\frac {x_{i}} {\beta }=x_i\left( \frac {\sum x_{i}^{\alpha}}{n}\right)^{-\frac {1} {\alpha }}
and
γiα=xiαnxiα(9) \gamma _{i}^{\alpha }=x_{i}^{\alpha}\cdot \frac {n} {\sum x_{i}^\alpha} \tag{9}
lnγi=lnxi1αxiαn(10) \ln \gamma _{i}=\ln x_i-\frac {1} {\alpha }\cdot \frac {\sum x_{i}^{\alpha }} {n} \tag{10}
這裏的 n=δin=\sum \delta_i 代表 failed number。

(9)和 (10)代入(8),即得
h(α)=n(Σxiαlnxixiα+1α+1nΣδilnxi)(10) h\left( \alpha \right) =n\left( -\frac {\Sigma x ^{\alpha }_iln x_{i}} {\sum x_{i}^{\alpha }}+\frac {1} {\alpha }+\frac {1} {n}\Sigma \delta_i\ln x_{i}\right)\tag{10}
求導可得
h(α)=n(1α2+xiα(lnxi)αxiα(xiαlnxi)2(xiα)2) h'\left( \alpha \right) =n\left( -\frac {1} {\alpha^2}+\frac {\sum x_{i}^{\alpha }\left( ln x_{i}\right) ^{\alpha }} {\sum x_{i}^{\alpha }}-\frac {\left( \sum x_{i}^{\alpha }\ln x_{i}\right) ^{2}} {\left( \sum x_i^{\alpha }\right) ^{2}}\right)
因而,我們通過牛頓法迭代搜索非線性方程 h(α)=0h(\alpha)=0 的解。
αk+1=αkh(αk)h(αk)(11) \alpha_{k+1}=\alpha_{k}-\frac{h\left(\alpha_{k}\right)}{h^{\prime}\left(\alpha_{k}\right)}\tag{11}

求解出 α\alpha 後,通過 (7)即可求解 β\beta

Weibull MLE 程序實現:

推導過程寫完了,怎麼用程序實現呢?從多年來失敗的研究經驗Shecan總結了一個道理:不要重複造輪子。(其實學習的時候重複造下輪子也有好處。) Shecan 發現Python有一個比較有意思的Package。 叫做Weibull,基本可以滿足你大部分的研究需求。具體怎麼使用,請參考下面的參考文獻。但是,有時候我們依舊需要對模型進行改進,比如說兩參數的Weibull分佈改成三參數的Weibull分佈。爲滿足這種需求,Shecan找出了Weibull Package MLE部分的源程序,並改寫成了面向過程的編程方式,具體如下:

你可以把下面的代碼複製到 Jupyter Notebook:

註明:程序來自於Weibull Package:

[https://weibull.readthedocs.io/en/latest/examples.html](Weibull Package Doc)

import numpy as np
import pandas as pd

測試數據:

fail_times = [ 9402.7, 6082.4, 13367.2, 10644.6, 8632.0, 3043.4, 1034.5, 2550.9, 2550.9, 3637.1]
suspended = [True, True, True, True, True,False, False, False, True, True]
data = pd.DataFrame({'data': fail_times, 'susp':suspended})

MLE Calibration: 通過以上的推導過程可以很容易的讀懂這段代碼。

# filter the failed samples and extract values
df_failed = data[data.susp == False].copy() 
dtf_failed = df_failed["data"].values
df_failed["ln_x_div_r"] = df_failed.apply(lambda s: np.log(s['data'])/len(df_failed), axis=1)
# extract data of all the values
dtf_all = data['data'].values
# use Newton-Rhapson method for estimating the shape parameter

# give initial value for the shape paramter:
shape = (((6.0 / np.pi ** 2)
            * (np.sum(np.log(dtf_all) ** 2)
            - ((np.sum(np.log(dtf_all))) ** 2) / dtf_all.size))
            / (dtf_all.size - 1)) ** -0.5

# 10 iterations of the newton-rhapson method
for i in range(1, 11):
    a = np.sum(np.log(dtf_failed) * 1.0) / dtf_failed.size
    b = np.sum(dtf_all ** shape)
    c = np.sum((dtf_all ** shape) * np.log(dtf_all))
    h = np.sum((dtf_all ** shape) * (np.log(dtf_all)) ** 2)

    shape = shape + (a + (1.0 / shape) - (c / b)) / ((1.0 / shape ** 2) + ((b * h) - c ** 2) / b ** 2)

shape = max(shape, 0.005)
scale = (np.sum((dtf_all ** shape) / len(df_failed))) ** (1 / shape)

# Print the results
print(shape,scale)

題外話:小時候老師教育我們如果要成爲一個成功的人,頭懸樑,錐刺骨,臥薪嚐膽,這些典故都很勵志。可是長大後發現了一個殘酷的真相,成功人士萬里挑一,而千千萬萬的普通人雖然沒有那麼成功,卻也在以一己之力改變世界。比如說戰疫前線的醫生和護士們,比如說用自己的才能爲這次疫情做貢獻的各路神仙。經歷了這些事,這些人,Shecan開始反思,與其教育自己的孩子成爲一個成功的人,不如教育他們盡一己之力做一個對社會有貢獻的人,或許這樣的人生會更自信,更快樂,並獲得更高的自我效能感。這也算是Shecan開始做筆記,並分享筆記的原因吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章