Generator.multivariate_hypergeometricは、多変量超幾何分布から乱数配列を生成するジェネレータメソッドです。
多変量超幾何分布は、超幾何分布を一般化したものです。簡単に言うと、壺の中に白・黒・青などの異なる石がN個入っているとして、そこから石をn個取り出した場合に、それぞれの石がどのぐらい含まれているかを表す確率分布です(一度取り出した石は壺に戻さない)。
なお超幾何分布については以下で解説しています。
ここでは、多変量超幾何分布から乱数配列を生成するGenerator.multivariate_hypergeometricについて解説します。
1. 書式
書き方:
Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')
パラメーター:
colors: sequence of integers 母集団Nの中に入っているそれぞれの種類のアイテムの数。ここから乱数が取り出される。 |
nsample: int 母集団から取り出す標本の数[<sum(colors)]。 |
size: int or tuple of ints, optional 生成する変量の数。intを渡した場合は、shape(int, len(colors))のランス配列を取得。(k, m)を渡した場合は、 shape(k, m, len(colors))の乱数配列を取得。デフォルト値のNoneでは、shape(len(colors))の乱数配列を取得。 |
method: string, optional 変量を生成する際のアルゴリズムを指定する。’count’か’marginal’から選ぶ。デフォルト値は’marginal’。Notesで後述。 |
戻り値:
out: ndarray or scalar 指定のsizeの乱数配列。sizeを指定しない場合は、shape(N,)の乱数配列 |
Notes
Generator.multivariate_hypergeometricでは、2つのアルゴリズムから選ぶことができます。
count アルゴリズムは、大雑把に言うと、以下のnumpyコードと同じです。このアルゴリズムは、sum(colors)の長さの一時的な整数の配列を使います。
choices = np.repeat(np.arange(len(colors)), colors)
selection = np.random.choice(choices, nsample, replace=False)
variate = np.bincount(selection, minlength=len(colors))
marginal アルゴリズムは、一変量超幾何のサンプラーを繰り返し呼び出すことによって変量を生成します。大雑把に言うと、以下のnumpyコードと同じです。
variate = np.zeros(len(colors), dtype=np.int64)
# `remaining` はcolorsの後ろからの累積和
# 例えば、colorsが [3, 1, 5]の場合、
# remainingは [9, 6, 5]になる
remaining = np.cumsum(colors[::-1])[::-1]
for i in range(len(colors)-1):
if nsample < 1:
break
variate[i] = hypergeometric(colors[i], remaining[i+1],
nsample)
nsample -= variate[i]
variate[-1] = nsample
デフォルトのmethodはmarginalです。しかし、例えば、colorsの要素が比較的小さな整数である場合は、count の方が高速です。もし、アルゴリズムのパフォーマンスが重要になってくる場合は、2つのメソッドを試して、性能が良い方を選びましょう。
2. サンプルコード
それでは、サンプルコードを見ていきましょう。
まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。
import numpy as np
rng = np.random.default_rng()
rng
こうして作成したジェネレータオブジェクト rng に対して、Generator.multivariate_hypergeometricを呼び出すことによって、多変量超幾何分布から乱数配列を取得することができます。
第一引数のcolorsには、異なる特性を整数で表現したシーケンス(リストなど)を渡します。第二引数のnsampleには取り出す総数nを渡します。sizeは出力する乱数配列のshapeです。
以下のコードは、[16, 8, 4]と特性が整数値で表現されている石を、壺の中から6個取り出した時の結果であると解釈することができます。
colors = [16, 8, 4]
rng.multivariate_hypergeometric(colors, 6)
それぞれ、3個,2個,1個取り出されました。
第三引数sizeを渡してみましょう。
rng.multivariate_hypergeometric(colors, 6, 3)
sizeにタプルを渡すことによって二次元配列以上で出力することもできます。
rng.multivariate_hypergeometric(colors, 6, (2, 2))
3. まとめ
以上の通り、Generator.multivariate_hypergeometricは、多変量幾何分布から乱数配列を生成するジェネレータメソッドです。
これまでは、numpy.random.multivariate_hypergeometric関数が使われていましたが、今後はこのジェネレータメソッドを使うようにしましょう。こちらの方が、処理が遥かに高速なので、大量のデータを扱う科学技術計算に適しています。
コメント