スポンサーリンク
スポンサーリンク

ベイズ推定と最尤推定の比較

マサムネのイメージ図 ベイズ統計学

データが何かの分布に従うと仮定したら、パラメーターを求める為に何か計算をします。その時の手法として、最尤推定とベイズ推定1があります。それぞれの手法を比較し、注意するべき事を見つけます。
分散が既知の場合の、正規分布の平均値の推定を通して検証してみます。

スポンサーリンク

ベイズ推定

ベイズ推定の手順を説明します。あるデータ(Y,X)があり、 Y={y1,,yN}は, 確率分布 yn=p(xn|θ)に従うとします。この時、良い感じの θ を決定すれば, XからYが予想できる2という訳です。上手くp(μ)を指定してやって、p(μ|x)が良く知っている確率分布になるようにしておくのが常套手段の1つです。p(μ)が指定されていると、ベイズの定理から、 p(μ|x)が求められます。
p(θ|x)=p(x|θ)p(θ)p(x)
この記事の中では、パラメーターの事後分布を求める事をベイズ推定と呼びます。
右辺において、θに注目するのであれば、p(x)は定数であることに注意しましょう。

ベイズ推定の計算

同じ計算をするので、多次元正規分布を考えて、データの次元を1次元にして結果を使います。分散行列Σは既知としましょう。 yn=N(xn|μ,Σ)の場合を考えます。また、μ も多次元正規分布に従うとします。
p(μ)N(μ0,Σ0)
μ0,Σ0は人間が適当に与えてやります。今回はデータを無尽蔵に増やせるので、どんな値を与えても3上手くいきます。
今回の場合だと、p(μ|X) は多次元正規分布になります。
p(μ|X)=N(μ|μ¯,Σμ)と置いて、μについて展開しておきます。
logp(μ|X)=12[μTΣμ1μ2μTΣμ1μ¯]+const
計算しやすいようにlogを取ったベイズの定理を考えます。
logp(μ|X)=logp(X|μ)+logp(μ)logp(X)
上で定義した確率分布を代入して、μについてまとめます。
logp(μ|X)=12[μT(NΣ1+Σμ01)μ2μT(Σ1nxn+Σμ01μ0)]+const
上の式と比べる事で、μが従う確率分布のパラメーターを求める事が出来ます。
Σμ1=NΣ1+Σμ01Σμ1μ¯=Σ1nxn+Σμ01μ0μ¯=(NΣ1+Σμ01)1(Σ1nxn+Σμ01μ0)

最尤推定の計算

正規分布の最尤推定については、以下の記事で解説しています。

Fisher情報量(Fisher情報行列)
Fisher 情報量(Fisher 情報行列)の定義と、その役割について解説します。統計量の推定をした時、推定量の分散の大きさについての情報を与えてくれるのがFisher 情報量(Fisher 情報行列)です。


結果的に、正規分布の平均値の最尤推定量はμ¯=1Nxnです。

python による実装

pythonで適当な正規分布を生成し、最尤推定、ベイズ推定それぞれで平均値を推定します。実験に使うコードを載せます。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

mu = 10
sig =5
Y = np.random.normal(loc=mu, scale=sig, size=100)
ys=[]
mu_ml=[]
fis=[]
mu_by=[]
lam =[]
for y in Y:
    ys.append(y)
    mu_ml.append(np.sum(ys)/len(ys) ) #最尤推定
    fis=np.append(fis, sig**2 /len(ys) )
  lam_by = len(ys)/sig+ 1/sig_zero
    lam = np.append(lam,lam_by)
    mu_by=np.append( mu_by,(np.sum(ys)/sig +mu_zero/sig_zero )/lam_by ) #ベイズ推定

plt.plot(mu_ml,label="Likelyhood")
plt.plot(mu_by, label="Byes")
plt.plot(10*np.ones(len(mu_ml)),c="r",lw=0.5)
plt.legend()
plt.ylim(5,15)
plt.title("Byes vs Lilelyhood")
ベイズvs最尤推定
ベイズ推定vs最尤推定

縦軸に推定された平均値、横軸に更新の回数を取ってグラフを描きました。
結果を見ると、ベイズ推定と最尤推定は殆ど同じ動きをしながらパラメーターを推定しています。

予測値の精度

予測の精度はどのくらいあるのでしょうか。
ベイズ推定ならμが従う正規分布の分散、最尤推定ならフィッシャー情報量の逆数が予測の精度の目安になります。フィッシャー情報量を知らない方は以下の記事をどうぞ。

Fisher情報量(Fisher情報行列)
Fisher 情報量(Fisher 情報行列)の定義と、その役割について解説します。統計量の推定をした時、推定量の分散の大きさについての情報を与えてくれるのがFisher 情報量(Fisher 情報行列)です。

正規分布の場合、平均値の最尤推定量の4分散は以下の式で下から抑えられています。
var[μ]σ2/N
この2つの目安を予測値の信頼度として、予測値のグラフに描き入れてみます。

最尤推定の方が信頼度が小さく、ベイズ推定は最尤推定より精度が高い、という結果になりました。
ベイズ推定の場合は、μを計算しやすいように色々仮定を置いていました。その仮定の下では自信を持って予測しているという事です。
このことは、上手く現実を再現しているとは限らない事に注意しましょう。実際、繰り返しが20回未満では全く違う平均値を予測していますが、ベイズ推定の予測精度は高いことになっています。5ついでに書いておくと、事後分布の分散は、既知の分散× データ数 と、人が設定した分散で決まるので、データ数が少ない場合は非常に恣意性が高くなります。
一方、最尤推定の誤差は、Fisher 情報量 (既知の分散/データ数)で下から抑えられています。更新をいくら続けても誤差が0になることはありません。その為、ベイズ推定より予測の精度が小さいという結果になっています。
今回の場合は、不偏推定量と最尤推定量が一致しているので、最尤推定を使っておけば良いということになります。
一般の場合では、最尤推定量が不偏推定量になるとは限らないのと、最尤推定の計算が出来るとは限らりません。ベイズ推定は、計算のしやすい仮定を置いたり、近似手法を使って計算を進める事が出来たりするので、難しい分布が出てくる問題にこそ、ベイズ推定が使えるかもしれません。

まとめ

  • ベイズ推定の手順を説明した
  • パラメーターをベイズ流で推定するときは、事後分布を手動で決める
  • ベイズ推定は、上手く機能しているように見えても現実をうまく再現しているとは限らない
  • 不偏推定量と最尤推定量が一致するなら最尤法
  • 難しい分布の場合は色々近似の技があるベイズ推定

  1. ベイズの定理で、パラメーターの従う事後分布を推定する手法を指しています
  2. もちろん、どんな確率分布に従うかは選ぶ必要があります。
  3. 現実では初期値が適当だと収束が遅くなって辛い事が起こります。
  4. 不偏推定量である必要がありますが、正規分布の場合は平均値の最尤推定量は不偏推定量です。
  5. わざわざ収束していない値を推定値として採用する人はいないと思いますが
タイトルとURLをコピーしました