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

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる