Generator.zipfは、ジップ分布(ジフ分布)から乱数配列を生成するジェネレータメソッドです。
ジップ分布は、ゼータ分布としても知られる連続確率分布であり、ジップの法則(出現頻度が k 番目に大きい要素が全体に占める割合は1/kに比例するという経験則)を満たす分布です。
このページではジップ分布から乱数配列を生成するGenerator.zipfについて解説します。
1. 書式
書き方:
Generator.zipf(a, size=None)
パラメーター:
a: float or array_like of floats 分布のパラメータ(>1) |
size: int or tuple of ints, optional 出力する配列のshape。(m, n, k)を渡すと、shape(m, n, k)の乱数配列を生成する。デフォルト値Noneで、aがスカラーの場合は1つの乱数の値を返す。それ以外の場合はnp.array(a).sizeの乱数配列を返す。 |
戻り値:
out: ndarray or scalar パラメータを設定したジップ分布から乱数配列を生成。 |
Notes
ジップ分布の確率密度関数は次の通りです。
分母の記号は、リーマンゼータ関数です。
2. サンプルコード
それでは、サンプルコードを見ていきましょう。
まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。
import numpy as np
rng = np.random.default_rng()
rng
こうして作成したジェネレータオブジェクト rng に対して、Generator.zipfを呼び出すことによって、ジップ分布から乱数配列を取得することができます。
rng.zipf(2., 5)
確率密度関数とともにヒストグラムを描いてみましょう。見やすくするために、乱数の値が50以下のものだけでプロットしています。
a = 2.
s = rng.zipf(a, 1000)
import matplotlib.pyplot as plt
from scipy import special
count, bins, ignored = plt.hist(s[s<50],
50, density=True)
x = np.arange(1., 50.)
y = x**(-a) / special.zetac(a)
plt.plot(x, y/max(y), linewidth=2, color='r')
plt.show()
3. まとめ
以上、Generator.zipfはジップ分布から乱数配列を生成するジェネレータメソッドです。
以前は、numpy.random.zipf関数が使われていましたが、ジェネレータメソッドを使うようにしましょう。こちらの方が、処理が高速で、大量のデータを扱う科学技術計算に適しているからです。
コメント