ベルヌーイ分布

Takami Torao
  • このエントリーをはてなブックマークに追加

0 = 黒、1 = 赤として赤の出る確率 を調整できるベルヌーイ試行のシミュレーション。+1 ボタンを押すと試行を 1 回行う。


0 , 0 , 期待値 0 , 分散 0 , 平均 0 , 標準誤差 0
0 1
確率
期待値
観測回数

定義と性質

結果が {0, 1}、{true, false}、{OK, NG} といった 2 値しかとりえない独立した事象の試みをベルヌーイ試行 (bernoulli trial) と呼ぶ。これらの結果は統計で扱う便宜上 に置き換えて考える。

ベルヌーイ試行において確率 で 1 が出る場合 より:

この をパラメータとした の確率分布 ベルヌーイ分布 (bernoulli distribution) と呼ぶ。ベルヌーイ試行を 回行ったときの 1 の観測回数の分布は二項分布で表される。また 2 値ではなく 値に一般化した分布はカテゴリカル分布となる。

アルゴリズム

ベルヌーイ試行関数

呼び出しごとに確率 true を返すベルヌーイ試行関数を考える。この場合、一般的なプログラミング言語で用意されている の範囲を取る一様疑似乱数が より小さいかで判定すれば良い。

def trial(p:Double):Boolean = math.random() < p

なお関数に与えられた p の条件を満たしていない場合の対処は省略している。実行結果は以下の通り。

scala> trial(0.6)
res1: Boolean = false

scala> trial(0.6)
res0: Boolean = true

scala> trial(0.6)
res1: Boolean = true

確率関数

この程度の条件であれば実装上はべき乗を使用するより if で分岐したほうが計算量が少なくコードの可視性も損ねない。

def p(p:Double)(b:Boolean):Double = if(b) p else (1 - p)

上記は Scala のカリー化を使用している。引数 p=0.6 を指定した時点でパラメータ を束縛した関数 (つまり確率分布が特徴づけされた確率関数) が得られるので確率分布を扱う上では便利かもしれない。

scala> val p6 = p(0.6) _
p6: Boolean => Double = $$Lambda$1087/1558931350@2aa176de

scala> p6(true)
res0: Double = 0.6

scala> p6(false)
res1: Double = 0.4

scala> p(0.75)(true)
res2: Double = 0.75

参照