最尤推定
このページでは、最尤推定についてあれこれ考える。
コイン投げ
偏りがあるコインを投げたところ、表をH、裏をTで表すことにして、
コイン投げの総数は5、表が出た回数は2であるから、すぐに
表が出る確率が
実際に微分をとって最大値を与える
このように、データ
練習:ベルヌーイ試行の最尤推定
コインを
ベイズ推定との関係
今度は、問題設定を変え、
すると、試行結果を知った上で
これらを見比べると、最初に述べた尤度は、
連続的な値を取るデータの尤度関数
連続値を取る
次に、データ
上の尤度関数は確率密度関数と同じ形をしているが、
そこで、
尤度はパラメータ
分布関数のパラメータによって、与えられたデータに対する尤度が変化する様子
尤度の最大化
複数のデータ点が与えられた際に、それぞれが同じ確率分布に従う独立事象(iid)で生じたとすれば、すべてのデータについての尤度を、それぞれのデータについての積とするのが自然である。
具体的な例として、平均
次に、(対数)尤度を最大にするようなパラメータを求めてみよう。
まず
分散
このように、単純なガウス分布の場合にパラメータの最尤推定を行うことは容易であるが、一般の分布関数については、非線形方程式を解く必要が生じる。
練習:ガウスモデルの最尤推定値
式(1)および式(2)が成り立つことを、具体的に対数尤度を偏微分して、確かめてみなさい。
練習:ポアソン分布の最尤推定
離散的な非負の値
データセット
正規乱数による「実証実験」
Pythonには疑似乱数を扱うモジュールが提供されているが、一様乱数だけでなく、いくつかの確率密度関数に従う乱数を発生させることができる。 以下は、SciyPyを使って、正規乱数の系列を発生させ、その平均と標準偏差を最尤推定で求めて、データのヒストグラムを推定された分布関数の両方をプロットするコードの例である。
# coding: utf-8 import numpy as np from scipy.stats import norm import matplotlib.pyplot as plt import math # 乱数発生 X = norm.rvs(loc=5, scale=2, size=100) print('data=',X) # 最尤推定 N = X.shape[0] mu = sum(X)/N print('mu=',mu) V = np.sum(np.square(X))/N - mu**2 sigma = math.sqrt(V) print('sigma=',sigma) x = np.linspace(norm.ppf(0.001,loc=mu,scale=sigma), norm.ppf(0.999,loc=mu,scale=sigma), 100) plt.hist(X,density=True,color=(0.2, 0.3, 0.9)) plt.plot(x,norm.pdf(x,loc=mu,scale=sigma),'-',color=(1.0,0,0.0),linewidth=1.0) plt.xlim(min(x),max(x)) plt.xlabel('x') plt.ylabel('P') plt.grid(True) plt.show()
正規乱数で生成されたデータのヒストグラム(青)と、最尤推定で得たパラメータの正規分布(赤の実線)
練習:ポアソン分布での実験
上記の正規乱数の例を参考に、ポアソン分布に従う乱数(非負の整数値)の系列を発生させ、そのパラメータを推定し、データのヒストグラムと推定された分布関数を表示するコードを作成してみなさい。
ヒント
SciPyを使うと
from scipy.stats import poisson ... lam = 5.0 X = poisson.rvs(lam, size=100)
のようにして、指定したパラメータ