jupyter | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
黒木玄
2019-09-21
1と2の目のみが出るルーレットを回したとき,
になる. これが二項分布の確率である.
三項分布も同じように得られる. 1,2,3の目のみが出るルーレットを回したとき,
と表わされる. これを三項分布の確率と呼ぶ.
与えられたサンプル
を尤度函数と呼ぶ. 尤度函数の値はパラメーター
尤度函数
を最大化すればよい.
(1)
が上に凸な函数であることを示せばよい. しかし, これは対数函数が上に凸な函数であることより明らかである.
(2)
を満たす
なので,
は同値である. これは
与えられたサンプル
前節の結果より, サンプルが
になる. すなわち, サンプル中の各目の割合をその目が出る真の確率の近似値とみなす推定法がこの場合の最尤法だということになる.
尤度函数の形は単峰型になる. そして山型の尤度函数の広がり方は
using Base64
displayfile(mime, file; tag="img") = open(file) do f
display("text/html", """<$tag src="data:$mime;base64,$(base64encode(f))">""")
end
using Plots
gr()
default(titlefontsize=10)
using ImplicitEquations
using Distributions
# 尤度函数 (p + q > 1 では値を NaN に設定)
likelihood_func(p, q; x=[34, 32, 34]) = if p + q ≤ 1
pdf(Multinomial(sum(x), [p, q, max(0, 1-p-q)]), x)
else
NaN
end
# 1フレーム分のプロット
function plot_random_linkelihood_func(n; p₀=0.3, q₀=0.3, α=0.05)
true_dist = Multinomial(n, [p₀, q₀, max(0, 1-p₀-q₀)]) # サンプルを生成する確率分布
tau = cquantile(Chisq(2), α)
X = rand(true_dist) # サンプルXをランダムに生成
k, l = X[1], X[2]
phat, qhat = k/n, l/n # 最尤法の解
MLE_str = "($(round(phat, digits=2)), $(round(qhat, digits=2)))"
p = q = range(0, 1, length=201)
z = likelihood_func.(p', q; x=X) # サンプルXから得られる尤度函数の値の計算
P1 = plot(; title="n = $n, sample = ($k, $l, $(n-k-l))")
heatmap!(p, q, z; colorbar=false, aspectratio=1)
scatter!([p₀], [q₀]; color=:cyan, markerstrokewidth=0, markersize=3, label="true param")
scatter!([phat], [qhat]; color=:blue, markerstrokewidth=0, markersize=2.5, label=MLE_str)
plot!(xlim=(0,1), ylim=(0,1))
plot!(xlabel="p", ylabel="q")
P2 = surface(p, q, z; colorbar=false, gridalpha=0.5, grid_lw=0.5)
plot!(xlabel="p", ylabel="q")
plot(P1, P2; size=(800, 400))
end
# GiF動画を作成
function gif_random_linkelihood_func(n; p₀=0.3, q₀=0.3, nframes=100, fps=2, fn="images/lik$n.gif")
anim = @animate for i in 1:nframes
plot_random_linkelihood_func(n; p₀=p₀, q₀=q₀, α=0.05)
end
gif(anim, fn, fps=fps)
displayfile("image/gif", fn)
end
gif_random_linkelihood_func(10)
gif_random_linkelihood_func(30)
gif_random_linkelihood_func(100)
gif_random_linkelihood_func(300)
gif_random_linkelihood_func(1000)