スチューデントのt分布の最尤推定
スチューデントのt分布は外れ値のあるデータに対してもロバストな推定を可能とする分布として知られている。忘備録としてこの記事では、そのt分布の最尤推定をする。
スチューデントのt分布
一次元のt分布は、パラメータを用いて次のような確率密度関数で表すことができる。
EMアルゴリズム
最尤推定には、EMアルゴリズムを用いる。をデータ、を潜在変数、をパラメータとする。 次式で尤度関数と対数尤度関数を示す。
Eステップ
の事後分布を計算する。
の事後分布によるの期待値は以下のようになる。
Mステップ
対数尤度関数の期待値を最大化するように、それぞれのパラメータを更新する。
ただし、パラメータに関しては、上の式のように解析解が得られないのでニュートン法による数値解析によってパラメータを更新する。
このようにEステップ、Mステップを繰り返すことによって尤度関数を最大化させて最尤推定をする。
実装
juliaを用いて実装をする。外れ値による影響を正規分布と比較するために、から10のデータのサンプルにから生起されるデータを1つ加えたデータセットでそれぞれを最尤推定して比較する。
using Plots using StatsPlots using Random using Distributions using SpecialFunctions using Statistics using StatsBase using Optim using ReverseDiff: gradient Random.seed!(1234) function e_eta(x, nu, lambda_, mu) return (nu + 1)/(nu + lambda_ * (x - mu)^2) end function e_etas(X, nu, lambda_, mu) return [ e_eta(x, nu, lambda_, mu) for x in X] end function e_log_eta(x, nu, lambda_, mu) return digamma((nu + 1.0)/2.0) - log((nu + lambda_ * (x - mu)^2)/2.0) end function e_log_etas(X, nu, lambda_, mu) return [ e_log_eta(x, nu, lambda_, mu) for x in X] end function fit_t(X) n = length(X) # init mu = median(X) lambda_ = iqr(X)/2.0 nu = 1.0 for i in 1:1000 # E step e_etas_ = e_etas(X, nu, lambda_, mu) e_log_etas_ = e_log_etas(X, nu[1], lambda_, mu) # M step # mu mu = (X' * e_etas_) / sum(e_etas_) # lambda_ lambda_ = 1.0 / ( (((X .- mu).^2)' * e_etas_) / n) # nu function f(nu) return digamma(nu[1]/2.0) - log(nu[1]/2.0) - (1.0 + sum(e_log_etas_)/n - sum(e_etas_)/n) end for j in 1:1000 tmp = nu - f([nu])/gradient(f, [nu])[1] if !isnan(tmp) nu = max(tmp, 1e-6) if abs(f([nu])) < 1e-6 break end else break end end end return mu, lambda_, nu end d = Normal(0.0, 1.0) noise_d = Normal(100.0, 1.0) data = rand(d, 10) outlier = rand(noise_d, 1) X = vcat(data, outlier) mu, lambda_, nu = fit_t(X) scatter(data, zeros(length(data)), label="data") scatter!(outlier, zeros(length(outlier)), label="outlier") plot!(fit_mle(Normal, X), label="Normal") Xs = Array(range(-100, 120, step=0.1)) function t_pdf(x, mu, lamda_, nu) return gamma((nu+1)/2)./gamma(nu/2).*sqrt(lambda_/(pi*nu)).*(1 .+ lambda_*(x .- mu).^2/nu).^(-(nu+1)/2) end Ys = t_pdf(Xs, mu, lambda_, nu) plot!(Xs, Ys.*0.035, label="Student t Distribution", title="MLE of the Student t distribution using EM Algorithm")
上記の結果のように正規分布は、外れ値に引っ張られた推定をしていることが分かる。一方、t分布は外れ値に対してロバストに推定可能であることが分かる。