多項分布
1 = 黒、2 = 赤、... としてそれぞれの生起確率
| |
1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 確率の重み |
|||||
| 出現確率 |
0 | 0 | 0 | 0 | 0 |
| 期待値 |
0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 観測値 |
0 | 0 | 0 | 0 | 0 |
定義と性質
独立した
このとき、事象ごとの観測回数が
以下は確率変数
多項分布の最尤推定、MAP 推定、ベイズ推定は多項分布の推定を参照。
確率変数 の組み合わせ
確率変数
実装例
以下は
// 階乗
def factrial(n:Int):Double = if(n <= 1) 1.0 else factrial(n - 1) * n
// 総乗
def product(min:Int, max:Int)(generator:Int => Double):Double = (min to max).map(generator).product
// 多項分布に従う確率を求める
def multi(x:Array[Int], p:Array[Double]):Double = {
assert(p.length == p.length && math.abs(p.sum - 1.0) <= 1e-15)
val k = x.length
val n = x.sum
factrial(n) / product(0, k - 1) { i => factrial(x(i)) } * product(0, k - 1) { i => math.pow(p(i), x(i)) }
}
// 確率変数の組み合わせを生成する (総数が膨大になる可能性があるためコールバックする)
def generateRandomVariables(k:Int, n:Int)(callback:Array[Int] => Unit):Unit = {
def _generate(x:Array[Int], n:Int, i:Int, callback:Array[Int] => Unit):Unit = {
if(i == x.length) {
if(n == 0) {
callback(x)
}
} else for(value <- 0 to n) {
x(i) = value
_generate(x, n - value, i + 1, callback)
}
}
_generate(new Array[Int](k), n, 0, callback)
}
val p = Array(0.1, 0.2, 0.4, 0.2, 0.1)
var combinations = 0
var totalProbability = 0.0
generateRandomVariables(k = 5, n = 6) { x =>
val probability = multi(x, p)
println(f"${x.mkString("[", ", ", "]")}%s: $probability%.6f")
combinations += 1
totalProbability += probability
}
println(f"$combinations%,d combinations, $totalProbability%f probability total")
// [0, 0, 0, 0, 6]: 0.000001
// [0, 0, 0, 1, 5]: 0.000012
// [0, 0, 0, 2, 4]: 0.000060
// ...
// [5, 1, 0, 0, 0]: 0.000012
// [6, 0, 0, 0, 0]: 0.000001
// 210 combinations, 1.000000 probability total
共通性と近似
カテゴリカル分布との共通性
多項分布はカテゴリカル分布に従う試行を
二項分布との共通性
適用例
「サンプルとして抽出するものが有限個のどれかに属している」というモデルに適応できる。よく例示されるのはサイコロで、
多項分布で注目するのは確率変数の出現回数のみで、出現する順序は無視されることに注意。
Example 1
一様に落ちてくる
上記の例でボールがそれぞれの区画に入る確率を
Example 2
サイコロは
Example 3
ある駅で列車に乗る人数の偏りを考える。
Example 4
100個に1個の不良品が混じる生産レーンを考える。つまり
Example 5
ビタミンC、カルシウム、鉄の 3 種類の錠剤を 3:2:2 の比率で十分な量を混ぜ合わせた。この中から任意の 4 錠を取り出したときにビタミンCが1錠、カルシウムが2錠、鉄が1錠となる確率を求める。
この場合、確率変数が取り得る値は VC, Ca, Fe であるから
参照
- 多項分布の推定 (MOXBOX)