Generator.multivariate_hypergeometric – 多変量超幾何分布から乱数配列を作成する方法

Generator.multivariate_hypergeometricは、多変量超幾何分布から乱数配列を生成するジェネレータメソッドです。

多変量超幾何分布は、超幾何分布を一般化したものです。簡単に言うと、壺の中に白・黒・青などの異なる石がN個入っているとして、そこから石をn個取り出した場合に、それぞれの石がどのぐらい含まれているかを表す確率分布です(一度取り出した石は壺に戻さない)

なお超幾何分布については以下で解説しています。

ここでは、多変量超幾何分布から乱数配列を生成するGenerator.multivariate_hypergeometricについて解説します。

目次

1. 書式

Generator.multivariate_hypergeometric

書き方:

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

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

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

第一引数のcolorsには、異なる特性を整数で表現したシーケンス(リストなど)を渡します。第二引数のnsampleには取り出す総数nを渡します。sizeは出力する乱数配列のshapeです。

以下のコードは、[16, 8, 4]と特性が整数値で表現されている石を、壺の中から6個取り出した時の結果であると解釈することができます。

In [2]:
colors = [16, 8, 4]
rng.multivariate_hypergeometric(colors, 6)
Out[2]:
array([3, 2, 1])

それぞれ、3個,2個,1個取り出されました。

第三引数sizeを渡してみましょう。

In [3]:
rng.multivariate_hypergeometric(colors, 6, 3)
Out[3]:
array([[4, 2, 0],
       [4, 2, 0],
       [2, 2, 2]])

sizeにタプルを渡すことによって二次元配列以上で出力することもできます。

In [4]:
rng.multivariate_hypergeometric(colors, 6, (2, 2))
Out[4]:
array([[[3, 3, 0],
        [3, 2, 1]],

       [[4, 1, 1],
        [5, 1, 0]]])

3. まとめ

以上の通り、Generator.multivariate_hypergeometricは、多変量幾何分布から乱数配列を生成するジェネレータメソッドです。

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる