Generator.multinomial – 多項分布から乱数配列を作成

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

多項分布は、二項分布の多変量解析です。n個の結果が想定できる事象の実験に使います。たとえば、コイン投げの結果は表裏の2つだけなので二項分布に従います。一方で、サイコロ投げの場合、結果は1から6までの6つあります。そのため、サイコロ投げの結果は多項分布に従います。

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

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

目次

1. 書式

Generator.multinomial

書き方:

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 – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。

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

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

以下のコードでは、サイコロを20回投げた時の出目の乱数を生成しています。

In [2]:
rng.multinomial(20, [1/6.]*6)
Out[2]:
array([4, 5, 3, 1, 5, 2])

この乱数配列は、20回の試行で、1から6までの目が、それぞれ4回,5回,3回,1回,5回,2回出ていることを表しています。

第三引数でsizeを指定すると、次のようにshape(size, N)の乱数配列を生成します。これは、サイコロの20回の試投を5セット行った結果と解釈できます。

In [3]:
rng.multinomial(20, [1/6.]*6, 5)
Out[3]:
array([[2, 3, 3, 4, 3, 5],
       [3, 2, 1, 5, 3, 6],
       [6, 1, 2, 4, 4, 3],
       [3, 5, 3, 4, 2, 3],
       [3, 4, 7, 2, 3, 1]])

以下のように指定することも可能です。

In [4]:
rng.multinomial([[10], [20]], [1/6.]*6, (2, 3))
Out[4]:
array([[[2, 2, 3, 1, 1, 1],
        [2, 1, 1, 3, 1, 2],
        [1, 1, 2, 1, 2, 3]],

       [[2, 6, 4, 4, 2, 2],
        [2, 3, 3, 8, 4, 0],
        [5, 6, 2, 1, 4, 2]]])

これは以下のように、pvalがブロードキャストされて適用されており、サイコロ投げ10回の試行と、20回の試行を行っていることを表しています。

第三引数のsizeで、shape(2, 3)を表しているので、それぞれの試行を3回ずつ行っています。

それぞれの出目の確率を変更することで、重心が傾いたサイコロを表現することができます。以下のコードでは、1から5の出目の出現確率はそれぞれ1/7、6の出目の出現確率だけ2/7になっています。

In [5]:
rng.multinomial(100, [1/7.]*5 + [2/7.])
Out[5]:
array([17,  9, 16, 20, 12, 26])

ご覧のように、6の目だけ出現回数が多くなっています。

他にも表が出る確率と裏が出る確率が異なるコインは、以下のように表現することができます。

In [6]:
rng.multinomial(100, [1.0 / 3, 2.0 / 3]) 
Out[6]:
array([21, 79])

3. まとめ

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる