2
0

ベルヌーイ分布を実装する

Last updated at Posted at 2024-03-20

確率分布で有名なベルヌーイ分布を理解するためにプログラミングで試します。動作環境はVisual Studio Community 2022のバージョン17.7.4です。

概要

ベルヌーイ分布とは、確率${\theta}$で1を、確率${\theta-1}$で0をとる離散確率分布のことです。確率質量関数は次の式で表されます。

P(x|\theta) = \theta^{x}(1 - \theta)^{1-x}
x = 0, 1
\theta\in(0, 1)

簡単に言うとコインを投げて裏表どちらが出るかとか、ゲームで攻撃が命中するか外れるかのような2択の試行を扱う離散確率分布です。

Pythonでの実装

Pythonでベルヌーイ分布を実装する場合、オープンソースのライブラリであるSciPyを使うと簡単に実装できます。SciPyは外部のライブラリなのでインストールされていない場合は、pip installでインストールしてください。Pythonでの実装は以下のようになります。

bernoulli.py
import scipy.stats as stats

d = stats.bernoulli(0.6) #確率0.6で1が出るベルヌーイ分布を定義
x = d.rvs(10) #ベルヌーイ分布に従うサンプルを10個生成
print(x)
# [0 1 1 1 0 1 1 1 1 0]
print(d.pmf(0)) #0が出る確率
# 0.4
print(d.pmf(1)) #1が出る確率
# 0.6

サンプルではstats.bernoulliの引数を0.6にしているため0より1が出やすくなっています。引数を変更することで0と1の出やすさを操作できます。

C++での実装

C++でベルヌーイ分布を実装する場合は、標準ライブラリのrandomを使います。C++での実装は以下のようになります。

Bernoulli.cpp
#include <iostream>
#include <random>

int main()
{
	std::random_device rng; //乱数インスタンスの生成
	std::bernoulli_distribution dist(0.6); //確率0.6で1が出るベルヌーイ分布を定義
 
    //ベルヌーイ分布に従うサンプルを10個生成
	for (int i = 0; i < 10; i++)
	{
		std::cout << dist(rng) << std::endl;
	}

	std::cout << 1 - dist.p() << std::endl; //0が出る確率
	std::cout << dist.p() << std::endl; //1が出る確率
}

C++はPythonと比較すると少し複雑ですが、標準ライブラリにベルヌーイ分布が付いているのでインストールなしで使えます。

参考

https://www.kspub.co.jp/book/detail/5279786.html
https://cpprefjp.github.io/reference/random/bernoulli_distribution/p.html

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0