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

Generator.hypergeometricは、超幾何分布から乱数配列を生成するnumpy.randomモジュールのジェネレータメソッドです。

超幾何分布の例として、黒石と白石が入っている壺を考えてみましょう。黒石は当たりで、白石は外れとします。ここからn個の石を取り出します。超幾何分布は、取り出したn個の中に、当たりである黒石がどれぐらい含まれているのかを示す確率分布です。

この確率分布は、二項分布と似ています。違いは、超幾何分布は一度取り出した石は戻さないという点にあります。二項分布では、1回石を取り出す度に、取り出した石を壺に戻します。標本の数が大きくなればなるほど、超幾何分布は二項分布に近づきます。

このページでは、この超幾何分布から乱数を生成するGenerator.hypergeometricを解説します。

目次

1. 書式

Generator.hypergeometric

書き方:

Generator.hypergeometric(ngood, nbad, nsample, size=None)

パラメーター:

ngood: int or array_like of ints
当たりの数(<10**9)
nbad: int or array_like of ints
外れの数(<10**9)
nsample: int or array_like of ints
抽出数(< ngood+nbad)
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合で、かつ、ngood, nbad, nsampleがスカラーの場合、1つの乱数の値を返す。それ以外の場合は、np.broadcast(ngood, nbad, nsample).sizeの乱数を生成する。

戻り値: 

out: ndarray or scalar
パラメータを設定した超幾何分布からの乱数を出力する。

Notes

Generator.hypergeometricでは、ngoodとnbadは10**9以下である必要があります。ここまで極端に大きな引数の場合、標本の処理の処理に使われるアルゴリズムがうまく機能せず、浮動小数点数の計算に支障が出てしまうからです。ここまで大きな値を扱う場合で、さらにnsampleがそこまで大きくない場合は、分布は二項分布に近くなります。そのため、binomial(n=nsample, p=ngood/(ngood + nbad))で対応することができます。

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 0x7FD48EA5ED68

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

以下のコードでは、当たりの数98個、外れの数2個の合計100個から10個取り出す試行を5回行っています。

In [2]:
ngood, nbad, nsamp = 98, 2, 10
rng.hypergeometric(ngood, nbad, nsamp, 5)
# 当たりの数98個、外れの数2個から10個取り出す試行を
# 行った場合に取り出した当たりの数 × 5セット
Out[2]:
array([10, 10, 10, 10,  9])

1回目から4回目の試行では、取り出したものは全て当たりでした。5回目の試行では1個だけ外れを引きました。

以下のヒストグラムは、10000回の試行を行った際の確率分布です。当たりを8個しか引けない(=数少ない外れをどちらも引く)確率は非常に小さいことがわかります。

In [3]:
s = rng.hypergeometric(ngood, nbad, nsamp, 10000)
from matplotlib.pyplot import hist
hist(s)
plt.show()

それでは、2個しかない外れをすべて引いてしまう確率はどれぐらいあるのでしょうか。以下の式で計算することができます。

In [4]:
s = rng.hypergeometric(ngood, nbad, nsamp, 100000)
sum(s<=8)/100000.
Out[4]:
0.00932

0.93%なので非常に小さな確率です。

3. まとめ

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

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

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

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

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

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

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

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

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる