プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

データ構造における負の二項分布とは?定義・数式・C++実装例を解説


負の二項分布(Negative Binomial Distribution)は、負の二項離散分布に従う整数値の乱数を生成する確率分布です。この分布は「パスカル分布(Pascal's Distribution)」としても知られています。

負の二項分布は、「成功確率 p の試行を繰り返し、k 回の成功を得るまでに何回の失敗(i 回)が起こるか」という確率をモデル化したものです。数式では次のように表されます。

$$P\lgroup i\arrowvert k,p\rgroup=\lgroup \frac{k+i-1}{i}\rgroup p^{k}\lgroup 1-p\rgroup^{i}$$

主なパラメータ

  • k:目標とする成功回数
  • p:1回の試行における成功確率(0 < p ≤ 1)
  • i:k 回成功するまでに発生した失敗回数

この分布の平均は k(1−p)/p、分散は k(1−p)/p² となり、p が小さいほど失敗回数のばらつきが大きくなるという特徴があります。

C++での実装例

以下は、C++11 以降で利用可能な標準ライブラリ <random>negative_binomial_distribution クラスを使用し、10,000 回の乱数を生成してその度数分布をヒストグラムとして表示するサンプルコードです。

#include <iostream>
#include <random>
using namespace std;

int main(){
    const int nrolls = 10000; // 乱数を生成する回数
    const int nstars = 100;   // 表示するアスタリスクの最大数
    default_random_engine generator;
    negative_binomial_distribution<int> distribution(3,0.5);

    int p[10]={};
    for (int i=0; i<nrolls; ++i) {
        int number = distribution(generator);
        if (number<10)
            p[number]++;
    }

    cout << "negative_binomial_distribution (3,0.5):" << endl;
    for (int i=0; i<10; ++i)
        cout << i << ": " << string(p[i]*nstars/nrolls,'*') << endl;
}

実行結果

0: ************
1: *******************
2: *****************
3: ****************
4: ***********
5: *******
6: *****
7: ***
8: **
9: *

出力結果を見ると、失敗回数が小さい値ほど出現頻度が高く、値が大きくなるにつれて頻度が徐々に減少していることがわかります。これはパラメータ k=3、p=0.5 の場合の負の二項分布の典型的な形状であり、右に裾を引いた歪んだ分布になっています。

まとめ

負の二項分布は、所定の成功回数に達するまでの失敗回数を扱う離散確率分布です。C++ の <random> ライブラリを使えば、数行のコードで簡単に乱数生成へ組み込むことができます。また、ポアソン分布よりも分散が大きい(過分散な)カウントデータのモデリングや、各種シミュレーションにおいても幅広く活用されています。

  1. データ構造入門:最小全域木(Minimum Spanning Tree)とは

    全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit

  2. データ構造における二分木の表現方法|配列と連結リストの違いを解説

    コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520