Generator.multinomialは、多項分布から乱数配列を生成するジェネレータメソッドです。
多項分布は、二項分布の多変量解析です。n個の結果が想定できる事象の実験に使います。たとえば、コイン投げの結果は表裏の2つだけなので二項分布に従います。一方で、サイコロ投げの場合、結果は1から6までの6つあります。そのため、サイコロ投げの結果は多項分布に従います。
なお二項分布については、以下で解説しています。
ここでは、多項分布から乱数配列を生成するGenerator.multinomialについて解説します。
1. 書式
書き方:
Generator.multinomial(n, pvals, size=None)
パラメーター:
n: int or array_like of ints 試行回数 |
pvals: sequence of floats, length p それぞれの結果が出る確率。合計値は1である必要がある。ただし、sum(pvals[:-1]<= 1)である限り、最後の要素は他の要素の値から自動で計算される。 |
size: int or tuple of ints, optional 出力する配列のshapeを指定する。デフォルト値のNoneの場合は1つの乱数の値を返す。 |
戻り値:
out: ndarray or scalar 指定のsizeの乱数配列。sizeを指定しない場合は、shape(N,)の乱数配列 |
2. サンプルコード
それでは、サンプルコードを見ていきましょう。
まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。
import numpy as np
rng = np.random.default_rng()
rng
こうして作成したジェネレータオブジェクト rng に対して、Generator.multinomialを呼び出すことによって、多項分布から乱数配列を取得することができます。
以下のコードでは、サイコロを20回投げた時の出目の乱数を生成しています。
rng.multinomial(20, [1/6.]*6)
この乱数配列は、20回の試行で、1から6までの目が、それぞれ4回,5回,3回,1回,5回,2回出ていることを表しています。
第三引数でsizeを指定すると、次のようにshape(size, N)の乱数配列を生成します。これは、サイコロの20回の試投を5セット行った結果と解釈できます。
rng.multinomial(20, [1/6.]*6, 5)
以下のように指定することも可能です。
rng.multinomial([[10], [20]], [1/6.]*6, (2, 3))
これは以下のように、pvalがブロードキャストされて適用されており、サイコロ投げ10回の試行と、20回の試行を行っていることを表しています。
第三引数のsizeで、shape(2, 3)を表しているので、それぞれの試行を3回ずつ行っています。
それぞれの出目の確率を変更することで、重心が傾いたサイコロを表現することができます。以下のコードでは、1から5の出目の出現確率はそれぞれ1/7、6の出目の出現確率だけ2/7になっています。
rng.multinomial(100, [1/7.]*5 + [2/7.])
ご覧のように、6の目だけ出現回数が多くなっています。
他にも表が出る確率と裏が出る確率が異なるコインは、以下のように表現することができます。
rng.multinomial(100, [1.0 / 3, 2.0 / 3])
3. まとめ
以上のように、Generator.multinomialは、多項分布から乱数配列を生成するジェネレータメソッドです。
以前は、numpy.random.multinomial関数が使われていましたが、ジェネレータメソッドを使うようにしましょう。こちらの方が、処理が高速で、大量のデータを扱う科学技術計算に適しているからです。
コメント