最尤推定

このページでは、最尤推定についてあれこれ考える。

コイン投げ

偏りがあるコインを投げたところ、表をH、裏をTで表すことにして、X=[H,T,T,H,T]というデータの系列が得られたとしよう。 そのとき、そのコインの表の出る確率 θ を推定する方法を考えてみよう。

コイン投げの総数は5、表が出た回数は2であるから、すぐにθ=25と答えが得られるだろうが、ここでは少し廻り道をして、考えてみたい。

表が出る確率がθのコインを投げて、[H, T, T, H, T]が生じる確率は p(X=[H,T,T,H,T]|θ)=θ×(1θ)×(1θ)×θ×(1θ)=θ2(1θ)3 である。 現に得られているデータから見て、もっとありそうなθの値の候補として、上のp([H,T,T,H,T]|θ)を最大化するようなθを考えるのは理にかなっているように思われる。 実際に、(0,1)の区間で p([H,T,T,H,T]|θ)θ の関数としてプロットすると、上に凸な形状をしていることがわかる。

実際に微分をとって最大値を与えるθを求めてみると θp(X=[H,T,T,H,T]|θ)=2θ(1θ)33θ2(1θ)2=θ(1θ)2(25θ)=0 とおいて θ=25 が得られる。

このように、データXが与えられたとき、確率分布(この場合は二項分布)のパラメータθの関数 p(X|θ)を尤度と呼ぶ。 そして、尤度を最大化することによって、確率分布の母数(パラメータ)を点推定する方法が最尤推定(maximum likelihood estimate; MLE)法である。

icon-pc 練習:ベルヌーイ試行の最尤推定

コインをN回投げて、表がNH回、裏がNNH回現れるようなデータが得られた場合、θを最尤推定してみなさい。

ベイズ推定との関係

今度は、問題設定を変え、θ=1/2と、θ=1/3のコインが沢山入っている箱の中からランダムに1枚を取り出し、何回かそれを投げてみて、どちらのコインか推定してみよう。 θ=1/2のコインの割合(すなわちそれを取り出す確率)をp(θ=1/2)θ=1/3のそれをp(θ=1/3)と表記する(この場合はp(θ=1/3)=1p(θ=1/2))。

すると、試行結果を知った上でθ=1/2である可能性は、ベイズの公式から p(θ=1/2|X)=p(X|θ=1/2)p(θ=1/2)p(X|θ=1/2)p(θ=1/2)+p(X|θ=1/3)p(θ=1/3) となる。

これらを見比べると、最初に述べた尤度は、θの事前確率が一様分布している(可能性のあるコインを等しい確率で取り出した)ことを暗に前提していると解釈できる。 ベイズ統計学では、事前確率分布を仮定する根拠が見当たらない場合、可能な事象の確率は全て等しいと仮定するのが通例で、これは理由不十分の原理(principle of insufficient reason) と呼ばれている。

連続的な値を取るデータの尤度関数

連続値を取るN個のデータ X=[x1,x2,,xN]があって、それらが同じ確率的な過程で生成され、かつ、互いに独立であるような場合を考える。 ただし、どのような分布関数に従っているのかは未知であるとしよう。 それだけでは話しが始まらないので、ある母数θを持つ確率分布 p(x|θ) をまず仮定する。 例えばガウス分布を仮定するときは、θは平均μと標準偏差σを表す(すなわちθ={μ,σ})。

次に、データxiに照らして、パラメータθの尤度として p(xi|θ) を採用することにする。 母数θを変化させると尤度も変化するが、尤度が大きいほどθがそのような値であったという確信の度合いも大きくなると考える。

上の尤度関数は確率密度関数と同じ形をしているが、Xについての確率を議論しているわけではない点に注意が必要である。 xを幅Δで等分して、k番目の区画を(kΔ,(k+1)Δ)としてみる。 すると、データがその区間に見いだされる確率は P(kΔ<X<(k+1)Δ)=kΔ(k+1)Δp(x|θ)dx である。 いま、データxik番目の区画にあった場合に、パラメータθの尤もらしさの指標として、上記の確率を採用するのは理にかなっているように思える。 ただし、そうすると、尤度は区画の幅Δのとり方に依存することになってしまう。 同じデータに対する尤度はユニークに定義されるべきであろう。

そこで、Δ0を取って、データxiに対する尤度を limΔ0P(xi<X<xi+Δ)Δ=p(xi|θ) で定義するのが都合がよい。

尤度はパラメータθの関数であるが、パラメータは確率変数ではないので、尤度関数のパラメータの全空間での積分 p(x|θ)dθ は1である必要は無い。他方、 p(x|θ)dx=1 は必ず満足されていなければならない。

分布関数のパラメータによって、与えられたデータに対する尤度が変化する様子

尤度の最大化

複数のデータ点が与えられた際に、それぞれが同じ確率分布に従う独立事象(iid)で生じたとすれば、すべてのデータについての尤度を、それぞれのデータについての積とするのが自然である。 L(X|θ)=i=1Np(xi|θ) そして、これを最大にするようなパラメータ(の組)が、データセットに照らして、いちばん尤もらしいと言えるだろう。

具体的な例として、平均μ、標準偏差σのガウス分布 p(x|μ,σ)=12πσexp[(xμ)22σ2] を考えてみよう。 N個の独立なデータに対する尤度は L(X|μ,σ)=i=1Np(xi|μ,σ)=1(2πσ2)N/2exp[i(xiμ)22σ2] となる。 対数関数は単調増加であるため、尤度の大小関係を比較する際には、尤度の対数(対数尤度)で議論する場合が多い。上記の場合の対数尤度は logL(X|μ,σ)=N2log(2π)N2logσ212σ2i=1N(xiμ)2 である。

次に、(対数)尤度を最大にするようなパラメータを求めてみよう。 まずμについて見てみると、対数尤度の式を眺めると i=1N(xiμ)2最小にするようなμが、尤度を最大にすることは明らかである(すなわち、μの最尤推定値は最小二乗法での結果に等しい)。 具体的には μlogL(X|μ,σ)=0 を解いて、 (1)μ=1Ni=1Nxi が得られる。すなわち、ガウス分布に対する平均の最尤推定量は、データの標本平均となる。

分散σ2についても同様に (σ2)logL(X|μ,σ)=0 と置いて解くと (2)σ2=1Ni=1N(xiμ)2 となる。すなわち、標本分散が分散の最尤推定量となる。

このように、単純なガウス分布の場合にパラメータの最尤推定を行うことは容易であるが、一般の分布関数については、非線形方程式を解く必要が生じる。

icon-pc 練習:ガウスモデルの最尤推定値

式(1)および式(2)が成り立つことを、具体的に対数尤度を偏微分して、確かめてみなさい。

icon-pc 練習:ポアソン分布の最尤推定

離散的な非負の値kを取る確率変数をパラメータλのポアソン分布 p(k|λ)=λkeλk! でモデル化する場合を考える。

データセット X=[k1,k2,,kN] が得られた際の、パラメータλの最尤推定量を求めなさい。

正規乱数による「実証実験」

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()

正規乱数で生成されたデータのヒストグラム(青)と、最尤推定で得たパラメータの正規分布(赤の実線)

icon-pc 練習:ポアソン分布での実験

上記の正規乱数の例を参考に、ポアソン分布に従う乱数(非負の整数値)の系列を発生させ、そのパラメータを推定し、データのヒストグラムと推定された分布関数を表示するコードを作成してみなさい。

icon-hint ヒント

SciPyを使うと

from scipy.stats import poisson
...
lam = 5.0
X = poisson.rvs(lam, size=100)

のようにして、指定したパラメータλのポアソン分布に従う乱数系列が得られる(この例ではλ=5)。