よくベイズ論(ベイズ統計学)の記事が見られているらしいので、ファイルを記事に張り付ける練習もかねて、実装したものもアップしてみようかと思った次第です。ただ、僕が遊ぶために作ったものなので、完成度はご愛嬌ということで。
エクセルとC++で計算してみました
題材は前の記事で使った話で、関西人と関東人のどちらの確率が高いかをベイズ論で計算するって話です。エクセルとC++とで実装してみましたので、よかったらダウンロードなりコンパイルなりして遊んでみてください。C++のソースコードは下の方にあります。エクセルでもC++でも、関西弁を使うごとに関西人である確率が上がっていき、関西弁を使わなければ関西人である確率が下がっていく(関東人である確率が上がっていく)のが確認できるかと思います。
何回でも更新可能
ベイズ論は、データが取れさえすれば何回でも確率を更新していけるんですな。最初の確率設定は0.5(50%)なんですが、一回関西弁を使うと確率を更新、もう一回使うとまた更新、次は使わなかったら使わなかったというデータに基づいて更新、・・・って感じで。
次々と更新していくときは、そもそも関西人である確率(事前確率といいます)を最後に更新された数値に次々と変えていってください。
ベイズ統計の計算方法の理解が深まるかと思いますので遊んでいただければと思いますー(もちろん、無理にとは言いませんが)。
ソースコード
下のソースコードがC++での実装例になります。マイクロソフトのVisual C++ 2017でコンパイルしました。
/****************************************************************
** 関西人か関東人かをベイズ論で判別しようというプログラムです
** 相手が関西弁を話したか否かで、相手が関西人である確率が変わります
**
** 極めて簡易で適当な判別プログラムなので、あまりいじめてあげないでください
*****************************************************************/
#include <iostream>
#include <string>
using namespace std;
double BayesianUpdate(double, double, double); // ベイズ更新関数(事前確率, AでかつAが起こる確率, BでかつAが起こる確率)
int main()
{
int result;
double PrimaryProbability = 0.5; // 現象を確認する前の事前確率(理由不十分の原理により、0.5に設定)
double WestAccent_west = 0.95; // 関西人でかつ関西弁を話す確率
double WestAccent_east = 0.02; // 関東人でかつ関西弁を話す確率
double CurrrentP, PostP;
CurrrentP = PrimaryProbability;
while (1)
{
cout << "現在、相手が関西人である確率 : " << CurrrentP << endl;
cout << endl;
cout << "関西弁を話したか?(No : 0 | Yes : 1 | end : -1)---";
cin >> result;
cout << endl;
if (result == -1) {
break;
}
else if (result == 0) {
PostP = BayesianUpdate(CurrrentP, 1 - WestAccent_west, 1 - WestAccent_east);
}
else {
PostP = BayesianUpdate(CurrrentP, WestAccent_west, WestAccent_east);
}
CurrrentP = PostP;
}
return 0;
}
double BayesianUpdate(double Primary, double Conditional1, double Conditional2)
{
double Probability1, Probability2;
Probability1 = Primary * Conditional1;
Probability2 = (1 - Primary) * Conditional2;
return Probability1 / (Probability1 + Probability2);
}
ではでは~。