はじめに
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)に、
- 赤玉と白玉を取り出す確率を定義
べイズの定理を用いて確率を算出
- べイズの定理は以下です
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の勉強をしたいという方は、こちらの記事も参考にしてみてください。
今回の記事は、以上です。
最後までお読み頂きありがとうございました。
コメント