人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

Pythonで具体的に説明・導出するベイズ推定!〜その2〜条件付き確率

今回は「Pythonで具体的に説明・導出するベイズ推定!〜その1〜」の続き、その2を書いていきます。具体例と共に出来るだけわかりやすく説明していきます!

www.hiro877.com

 

前回は、ベイズ推定導出の前段階として、

・同時確率(同時分布)

・Marginalizaion(周辺化)

について実装と共に説明しました。

 

今回も、ベイズ推定の導出に向けて頑張ります。

 

目的

Pythonベイズ推定を実装しながら証明する!

 

使用したもの

python

 

実験の流れ

・条件付き確率

ベイズの定理

※今回は条件確率しか説明できませんでした。ベイズの定理は〜その3〜で

 

 

では、Let's 実験!

 

条件付き確率(Conditional probability)

  Pr(x | y=y1)

条件付き確率とは、例えば、y=y1に固定された状態でのxの確率のことを指します。

以下の図で説明していきます。

y=y1に固定したxの取りうる値は図の上の線を指します。

y=y2の場合は下の線となります。

ただし、これでは確率とはなりません!

「それは、確率分布とは全てを積分して1にならないといけないからです!」

下の図の同時分布では、xとy全ての成分を足して1になる様に正規化されています。なので、yを1つ固定した断面を取ってきただけでは足して断面が足して1になることはありません。そこで1つの断面を正規化しなくてはなりません。その正規化の式が次の様になります。

 Pr(x|y = y^*) = \frac{Pr(x,y = y^*)}{\int Pr(x,y = y^*) dx} = \frac{Pr(x,y = y^*)}{Pr(y = y^*)}

分子のPr(x,y = y^*)は断面を取り出した部分になります。(y^*は固定されたy1, y2, y3, ...とする)

分母は正規化するための式です。この式はyで固定したy(y1など)がどれぐらい取りやすいか です。ここで出てくるのが周辺化です。yを固定してxについて積分しているのが分母の計算でこれは周辺化と同じ計算をしています。

教科書などに出てくる式が次の式です。

 Pr(x|y) = \frac{Pr(x, y)}{Pr(y)}

xとyの同時分布をyの周辺化で割る、これが条件付き確率となります。

この式の分母を両辺にかけたものも教科書等に登場します。

Pr(x, y) = Pr(x|y)Pr(y)

xについても同様に次の様にかけます。

Pr(x, y) = Pr(y|x)Pr(x)

f:id:hiro-htm877:20190213211224p:plain

 

 

では、前回と同じ確率変数で実装していきます。

使用する確率変数は学校まで行くのに、どんな人が(Y)、どの交通方法(X)を使用しているのかを確率で表現しています。

Y: 男性、女性、教員

X: 自転車、徒歩、電車、車

条件付き確率なので、yを女性に固定した際の確率を計算します。

 

ソースコード 

   if __name__ == "__main__" :
    argvs = sys.argv
    P = [[0.15, 0.1, 0.1, 0.01], [0.1, 0.2, 0.05, 0.04], [0.05, 0, 0.1, 0.1]]
    Y = ["男子", "女子", "教員"]
    X = ["   ", "自転車", "徒歩", "電車", "車"]
    for str in X:
        print str,
    print "\n",
    for i, y in enumerate(P):
        print Y[i],
        for x in y:
            print x,
        print "\n",
    print "\n",
    print "同時確率(同時分布)"
    print "P(Y=2, X=0) = ",  P[2][0]
    print "P(Y=1, X=3) = ",  P[1][3]
    print "=================="*3
    print "Marginalizaion(周辺化)"
    Pr = [0 for i in range(len(P[0]))]
    print Pr
    for i, y in enumerate(P):
        for j, x in enumerate(y):
            Pr[j] += x
    print "Pr(x) = ", Pr
    print ""
    Pr = [0 for i in range(len(P))]
    print Pr
    for i, y in enumerate(P):
        for j, x in enumerate(y):
            Pr[i] += x
    print "Pr(y) = ", Pr
    print "=================="*3
    print "条件付き確率"
    total = 0
    for i in range(4):
        conditional_probability = P[1][i] / sum(P[1])
        total += conditional_probability
        print conditional_probability
    print total

出力結果

  自転車 徒歩 電車 車
男子 0.15 0.1 0.1 0.01
女子 0.1 0.2 0.05 0.04
教員 0.05 0 0.1 0.1

同時確率(同時分布)
P(Y=2, X=0) = 0.05
P(Y=1, X=3) = 0.04
======================================================
Marginalizaion(周辺化)
[0, 0, 0, 0]
Pr(x) = [0.3, 0.30000000000000004, 0.25, 0.15000000000000002]

[0, 0, 0]
Pr(y) = [0.36, 0.39, 0.25]
======================================================
条件付き確率
P(x|y) 0.25641025641
P(x|y) 0.512820512821
P(x|y) 0.128205128205
P(x|y) 0.102564102564
total 1.0

 

女性を固定した時の自転車、徒歩、電車、車の確率を計算しました。

つまり、女性の自転車、徒歩、電車、車の使用率を計算したことになります!

合計も1.0担っており、正規化されていることが証明されました。 

 

今回も条件付き確率の説明が長くなってしまったため、次の〜その3〜でベイズ推定を説明したいと思います、

記事が長くなって申し訳ありません!

 

今回も呼んで下さりありがとうございました! 

 

f:id:hiro-htm877:20190213230050j:plain