最尤推定量(法)について
概要
- 最尤推定量とは頻度論的手法で観測したデータから確率を求める方法である
尤度関数を用いた導出
- 確率密度関数の求めたいパラメータを\(\theta\)としてこれを対数を取る
- 対数をとった後に微分して鞍点を計算し\(\theta\)を求める
母集団のパラメータを\(\theta\)とすると、パラメータ\(\theta\)である確率は以下のようになる \(\begin{equation*} \Pr(x_1, \ldots, x_n \,|\, \theta) = f(x_1, \ldots, x_n \,|\, \theta) \end{equation*}\)
この時、パラメータ\(\theta\)の尤度関数は以下のように定義できる \(\begin{equation*} L(\theta) = f(x_1, \ldots, x_n \,|\, \theta) \end{equation*}\)
対数をとり、\(\theta\)について微分した式の解により最大となる点がわかる \(\begin{equation*} \frac{d}{d \theta} \ln L(\theta) = 0 \end{equation*}\)
サンプルの質と尤度
- サンプル数が大きければ\(\theta\)の信頼度が高くなる
- 例えば、コインを10回投げて2回表が出る信頼度と、100回投げて20回表が出る信頼度は異なる
from scipy.special import comb
import numpy as np
import matplotlib.pyplot as plt
from functools import reduce
def binom(n: int, k: int, p: np.array) -> np.array:
return int(comb(n, k)) * p**k * (1 - p)**(n - k)
ns = [10, 100]
ks = [np.array([2, 5, 8]), np.array([20, 50, 80])]
p = np.linspace(0, 1, 100)
fig, axs = plt.subplots(1, 2, figsize=(9.6, 3.6))
for ax, n, k in zip(axs, ns, ks):
ax.set_title("n={}".format(n))
for t in k:
p_mle = t / n
prob = binom(n, t, p) # 二項分布でN回中、t回表が出るが、確率がpの時
ax.plot(p, prob, c='navy')
ax.plot((p_mle, p_mle), (0, binom(n, t, p_mle)), c='gray', linestyle='dashed')
ax.set_xlim(0, 1)
ax.set_xticks(np.arange(0, 1.1, 0.1))
plt.show()