Generator.negative_binomial – 負の二項分布から乱数を作成

Generator.negative_binomialは、負の二項分布から乱数配列を生成するジェネレータメソッドです。

負の二項分布は、n回の成功を達成するまでのN回の失敗の確率を表す確率分布です。たとえば、3回1の目が出るまでサイコロを投げるとして、それまでに出る1以外の目の回数の分布が負の二項分布です。

なお二項分布については、以下で解説しています。

ここでは、負の二項分布から乱数配列を生成するGenerator.negative_binomialについて解説します。

目次

1. 書式

Generator.negative_binomial

書き方:

Generator.negative_binomial(n, p, size=None)

パラメーター:

n: float or array_like of floats
成功回数(>0.)
p: float or array_like of floats
成功確率(0<p<=1)
size: int or tuple of ints, optional
出力する配列のshape。デフォルト値のNoneで、nとpが共にスカラーの場合は1つの乱数の値を返す。それ以外の場合は、np.broadcast(n, p).sizeの乱数配列を返す。

戻り値: 

out: ndarray or scalar
パラメータを設定した負の二項分布から乱数配列を生成。それぞれの乱数配列のsizeは、任意の成功回数nと、nを達成するまでの失敗の回数。

2. サンプルコード

それでは、サンプルコードを見ていきましょう。

まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng
Out[1]:
Generator(PCG64) at 0x7FBA91B6BD68

こうして作成したジェネレータオブジェクト rng に対して、Generator.negative_binomialを呼び出すことによって、負の二項分布から乱数配列を取得することができます。

例えば、以下のコードでは、サイコロで特定の目を3回出すまでの失敗回数を取得しています。

In [2]:
suc = 3 # 成功回数
prob = 1/6 # 成功確率
rng.negative_binomial(suc, prob, 5)
Out[2]:
array([ 5,  8,  2, 19, 12])

それぞれ、5回, 8回, 2回, 19回, 12回失敗しました。

現実の例に当てはめてみましょう。ある油田発掘会社があるとします。この会社が調査した発掘候補の場所が10万箇所あり、それぞれ0.1(10%)の確率で実際に油田が発掘されると見積もっているとします。それでは、この会社が1つ2つと油田を発掘していくと、次の油田発掘の確率はどのように変化していくでしょうか。

それを計算したものが以下です。

In [3]:
s = np.random.default_rng().negative_binomial(1, 0.1, 100000)
for i in range(1, 11): 
   probability = sum(s<i) / 100000.
   print(i, "石油発見!, 確率 =", probability)
1 石油発見!, 確率 = 0.09861
2 石油発見!, 確率 = 0.1883
3 石油発見!, 確率 = 0.26943
4 石油発見!, 確率 = 0.34334
5 石油発見!, 確率 = 0.40997
6 石油発見!, 確率 = 0.46721
7 石油発見!, 確率 = 0.52003
8 石油発見!, 確率 = 0.56711
9 石油発見!, 確率 = 0.61013
10 石油発見!, 確率 = 0.64897

3. まとめ

以上のように、Generator.negative_binomialは、負の二項分布から乱数配列を生成するジェネレータメソッドです。

以前は、numpy.random.negative_binomial関数が使われていましたが、ジェネレータメソッドを使うようにしましょう。こちらの方が、処理が高速で、大量のデータを扱う科学技術計算に適しているからです。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる