人工知性を作りたい

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

Pythonで具体的に説明・導出するベイズ推定!〜その3〜完結編!

今回は「Pythonで具体的に説明・導出するベイズ推定!〜その2〜条件付き確率編」の続き、その3を書いていきます。今回でベイズの定理導出を完結させます!

(具体例と共に出来るだけわかりやすく説明していきます!)

www.hiro877.com

www.hiro877.com

 

 

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

・同時確率(同時分布)

・Marginalizaion(周辺化)

・条件付き確率

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

 

今回は本題である「ベイズ推定の導出」を行います

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

 

目的

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

 

使用したもの

python

 

実験の流れ

ベイズの定理

 

では、let's 実験!

 

ベイズの定理

まずは前回の復習として条件付き確率の式を示します。

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

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

この2式の左辺はxとyの同時分布になっており、同じものです。ですので、代入して、

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

と表せます。そしてPr(y|x)は次の式で表せます。

これがベイズの定理の式です。

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

 

更にこの式を変形して次のように表す場合もあります!

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

Pr(y|x) = \frac{Pr(x|y)Pr(y)}{\int Pr(x, y)dy}  分母は周辺分布をyで積分したものです。

Pr(y|x) = \frac{Pr(x|y)Pr(y)}{\int Pr(x|y)Pr(y)dy}   分母に条件付き確率の式を代入

 

これがベイズの定理です。この式の1つ1つの要素を説明していきます。

 

ベイズの定理:左辺

・事後確率(posterior):xがわかった(見た)上でのyの確率

Pr(y|x)

 

ベイズの定理:右辺の分子

・事前確率(prior):xを見る前に分かっているyの情報(確率)

Pr(y)

・尤度(likelyhood):あるyがあった時にxが観測されうる確率のようなもの(条件付き確率)

Pr(x|y)

 

ベイズの定理:右辺の分母

・証拠(evidence):定数項。右辺を積分して1(正規化)にするための項。

 \int Pr(x|y)Pr(y)dy

そして、覚えてほしいことが

「尤度と事前分布の席を取ると事後確率になる」

 ということです。

 

 

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

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

Y: 男性、女性、教員

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

今回はX=2、つまり、電車を使用している人がどんな人なのかを計算します。

 

ソースコード 

    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_x = [0 for i in range(len(P[0]))]
    print Pr_x
    for i, y in enumerate(P):
        for j, x in enumerate(y):
            Pr_x[j] += x
    print "Pr(x) = ", Pr_x

    print ""
    Pr_y = [0 for i in range(len(P))]
    print Pr_y
    for i, y in enumerate(P):
        for j, x in enumerate(y):
            Pr_y[i] += x
    print "Pr(y) = ", Pr_y
    print "=================="*3
    print "条件付き確率"

    total = 0
    for i in range(4):
        conditional_probability = P[1][i] / sum(P[1])
        total += conditional_probability
        print "P(x|y)", conditional_probability
    print "total ", total
    print "=================="*3
    print "ベイズの定理"
    print "=================="*3
    total = 0
    print "Pr(y|x=2)のベイズの定理"
    for y in range(len(P)):
        print "y =",y
        conditional_probability = P[y][2] / sum(P[y])
        likelyhood = conditional_probability
        prior = Pr_y[y]
        evidence = Pr_x[2]
        bayes = likelyhood*prior/evidence
        total += bayes
        print "likelyhood", likelyhood
        print "prior", prior
        print "evidence", evidence
print "bayes", bayes print "=================="*3 print "total", 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

======================================================
ベイズの定理
======================================================
Pr(y|x=2)のベイズの定理

y = 0
likelyhood 0.277777777778
prior 0.36
evidence 0.25
bayes 0.4
y = 1
likelyhood 0.128205128205
prior 0.39
evidence 0.25
bayes 0.2
y = 2
likelyhood 0.4
prior 0.25

evidence 0.25
bayes 0.4

======================================================

total 1.0

 

ベイズの定理をx=2の条件で解きました。

bays値=Pr(y|x=2) がトータルで1.0になっているので実装が上手くいったと言えます。

 

これで、証明は終了です!

ベイズの定理を使えば、迷惑メールの分類を行えたり、最近流行りのAI・機械学習何度にも使われている技術なので覚えておくと役立つと思います。!

 

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