読者です 読者をやめる 読者になる 読者になる

kivantium活動日記

プログラムを使っていろいろやります

頻度主義では確率が結果を決める。ベイズ主義では結果が確率を決める!

機械学習

最近パターン認識機械学習PRML)のゼミをやっています。この本は機械学習の数式的側面をしっかり説明してくれているのですが、数式ばかり出てきてあまり実例が出てきません。というわけで実例を自分で作ってみることにしました。ここでは上巻2.1の二値変数で出てくるコイン投げについて実験してみることにします。

頻度主義とベイズ主義

コインを投げた時に表が出る確率を、頻度主義とベイズ主義それぞれの手法で求めました。コインをN回投げて表が出た回数をmとすると、頻度主義では
{ \displaystyle
\frac{m}{N}
}
とするのが最も可能性の高い確率値になり、ベイズ主義では
{ \displaystyle
\frac{m+a}{N+a+b}
}
とするのが最も可能性の高い確率値になります。(多分そういう理解でいいはず……)
ここで、aとbは観測前に事前の予想として与える数値で、表が出るとaが+1、裏が出るとbが+1されます。(詳細は本を読んでください)

やったこと

70%の確率で表が出るコイン(歪んでしまったのでしょう)を100回振って、出た結果を元に表が出る確率を頻度主義・ベイズ主義それぞれの手法で求めてみます。

ここでは事前の予想として、a=b=2としておきます。このとき、確率分布は図のようになります。50%くらいになる確率が一番高いだろうという予想です。f:id:kivantium:20140515005235p:plain

実際にコインを100回投げるのは面倒なのでプログラムで代用します。コードは次の通り

# -*- coding: utf-8 -*-
import random

def flip():
    if random.randint(1,100) > 30:
        return 1
    else:
        return 0

m = 0
a = 2
b = 2

for N in range(1,101):
    if flip() == 1:
        m += 1
        a += 1
    else:
        b += 1
    f_mu = float(m)/N
    b_mu = float(m+a)/(N+a+b)
    print N,f_mu,b_mu

このプログラムでは一回投げるごとにその時点での予想確率を表示します。
その後でLibreOffice Calcで100回投げ終わるまでの予想確率の推移をグラフにします。

結果

とりあえず4回分の結果を貼っておきます。
f:id:kivantium:20140515005606p:plain
f:id:kivantium:20140515005613p:plain
f:id:kivantium:20140515005620p:plain
f:id:kivantium:20140515005625p:plain

見て分かるように、頻度主義的アプローチではサンプル数が少ないときにかなり大きく予想を外していますが、ベイズ主義的アプローチではそこまでひどい値になっていない気がします。

ただ、100回も投げると両者の差はあまり発生しないようです。

感想

頑張って読んだ割にはベイズ主義的アプローチも大したことないような……。もっと読み進めればすごさが分かると信じて先に進みます。