Python

【Python】べイズの定理 初心者向けに分かりやすく解説

Python

はじめに

Pythonでべイズの定理を解説したいと思います。

悩んでる人
悩んでる人
  • べイズの定理ってなんだ?
  • Pythonでどうやってやるの?

こういった悩みをおもちの方におすすめの記事です。

この記事のゴール

以下二点をの疑問を解説し、明確にします。

  • べイズの定理ってなんだ?
  • Pythonでどうやってやるの?

ベイスの定理とは?

  • べイズの定理とは、ある事象において、「結果」が観測されたとき、その背景にある「原因」の確率を求めたいときに使う定理です。

べイズの定理の例題

問題

問題:参加者が取り出した玉の色から、選ばれた袋がA,Bのどちらであるか推定する

条件は以下です。

  • 赤玉と白玉が入った袋Aと袋Bがある
  • 袋Aには赤玉が1つ、白玉が1つはいっている
  • 袋Bには赤玉が1つ、白玉が2つはいっている
  • A,Bどちらかの袋から玉を一つ取り出す
  • しかし、観測者には、どちらの袋が選ばれたかは不明である
  • 参加者は袋から玉を取り出し、色を確認したら袋に戻す

解き方

この問題を解くのにべイズの定理を使用します。

それぞれの事象の確率を配列に格納する

# 袋の種類
Bag_A = 0
Bag_B = 1
# 玉の色
Ball_Red = 0
Ball_White = 1
# 袋を選ぶ確率
prob_bag = []
prob_bag.insert(Bag_A, 1/2)
prob_bag.insert(Bag_B, 1/2)
# 袋内の玉の色を選ぶ確率
prob_ball = []
prob_ball_a = []
prob_ball_a.insert(Ball_Red, 1/2)
prob_ball_a.insert(Ball_White, 1/2)
prob_ball.insert(Bag_A, prob_ball_a)
prob_ball_b = []
prob_ball_b.insert(Ball_Red, 1/3)
prob_ball_b.insert(Ball_White, 2/3)
prob_ball.insert(Bag_B, prob_ball_b)

ここで配列に挿入する関数としてinsertを用います。insert関数の使い方は、以下です。

  • list=[]
  • list.insert(A,B)

A = 配列に格納するインデックス
B = 配列に格納する値

よって出力結果は以下です。

それぞれの配列(prob_ball_a,prob_ball_b)に、

  • 赤玉と白玉を取り出す確率を定義

べイズの定理を用いて確率を算出

  • べイズの定理は以下です
画像に alt 属性が指定されていません。ファイル名: img_0335-1024x209.jpg

cは補集合を表します。例えば、BcはBでない集合を表します。

P(B|A)のような書き方は、条件付き確率といいます。これは、事象Aが生じたもとでの、事象Bの確率を表します。

上記を使って、先ほどの問題を解きます。

仮に以下のように設定してみましょう。

  • P(B|A):白い玉を取りだした時の袋Aの確率

よって、確率は以下のようになります。

  • P(A|B):袋Aから白い玉を1個取り出す確率=1/2
  • P(A|Bc):袋Bから白い玉を1個取り出す確率=2/3
  • P(B):袋Aの確率=1/2
  • P(Bc):袋Bの確率=1/2

P(B|A) = (1/2*1/2)/{(1/2*1/2)+(2/3*1/2)}=0.25/(0.25+0.33…)=0.25/0.5833…=0.428571…

おおよそ42.9%と求まります。

これをコードで実装すると以下のようになります。

# 事後確率を計算する
def posterior(ball_list, bag):
    if len(ball_list) == 1:
        return prob_ball[bag][ball_list[0]] * prob_bag[bag]
    else:
        return prob_ball[bag][ball_list[0]] * posterior(ball_list[1:], bag)

# 袋Aが選ばれる確率を計算する
def posterior_a(ball_list):
    return posterior(ball_list, Bag_A) / (posterior(ball_list, Bag_A) + posterior(ball_list, Bag_B))

ball = [Ball_White] 
posterior_a(ball)

出力結果は、以下です。

  • 0.4285714285714286

計算結果通りになりました。

つまり、白玉一つの場合は、袋Aの確率が、43%で、袋Bの確率が57%です。

参考

白玉3つ 且つ 赤玉3つの場合は、以下のように計算することができます。

ball = [Ball_White] *3
ball.extend([Ball_Red] * 3)
posterior_a(ball)

posterior(ball_list, bag)という関数の中に、posterior(ball_list[1:], bag)が入っていますね。

このように繰り返し演算することをリカーシブルと呼びます。

まとめ

今回は、Pythonでべイズの定理を解説しました。

  • べイズの定理とは、ある事象において、「結果」が観測されたとき、その背景にある「原因」の確率を求めたいときに使う定理です。

もっとPythonの勉強をしたいという方は、こちらの記事も参考にしてみてください。

今回の記事は、以上です。

最後までお読み頂きありがとうございました。

コメント

タイトルとURLをコピーしました