Generator.pareto – パレート分布から乱数を作成する方法

Generator.paretoは、パレート分布(厳密にはパレートⅡ分布)から乱数配列を生成するジェネレータメソッドです。

パレート分布は80-20ルールとして広く知られています。よく聞くのは業績の80%を全体のたった20%の人々が上げており、残りの80%の人々は20%の業績しか上げていないというものです。このべき乗確率分布は、現実の数々の問題に使われています。例えば、富の配分の分布、保険に関する統計の分布、油田サイズの分布などです。

このページではパレート分布から乱数配列を生成するGenerator.paretoについて解説します。

目次

1. 書式

Generator.pareto

書き方:

Generator.pareto(a, size=None)

パラメーター:

a: float or array_like of floats
分布の形状
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

厳密に言うと、Generator.paretoは指定の形状のパレートⅡ(または「ロマックス分布」)から乱数を取得します。クラシカルなパレート分布は、ロマックス分布に1を足して、スケールのパラメータmを掛けることで得られます。パレート分布の確率密度関数は次の通りです。

αがshapeで、mがスケールです。

ロマックス分布の最小値は0ですが、クラシカルなパレート分布の最小値はμです。標準的なパレート分布のそれはμ=1です。またロマックス分布は、一般化パレート分布(SciPyで使うことができます)のscaleを1、locを0に設定した単純化バージョンとも考えられます。

パレート分布は0より大きくなければならず、上限値は無制限です。

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

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

なお、このジェネレータメソッドは、パレートⅡ分布(ロマックス分布)の乱数配列を生成します。

In [2]:
# パレートⅡ分布(ロマックス分布)の乱数配列を生成
rng.pareto(3. ,10)
Out[2]:
array([1.61060335, 1.55891573, 0.39188428, 0.07734105, 0.96868781,
       0.03160615, 0.27717567, 0.03732869, 0.02739996, 0.21086739])

クラシカルなパレート分布の乱数配列を取得したい場合は、次のように書きます。

In [3]:
# クラシカルなパレート分布の乱数配列を生成
a, m = 3., 2. 
s = (rng.pareto(a, 10000) + 1) * m
s
Out[3]:
array([6.18827889, 2.36203412, 2.82371464, ..., 2.24724881, 2.33322658,
       2.45780189])

これのヒストグラムと確率密度関数を描いてみましょう。

In [4]:
#  クラシカルなパレート分布(最小値μ)
#  のヒストグラムと確率密度関数
a, m = 3., 2.  # shape and mode
s = (rng.pareto(a, 10000) + 1) * m

import matplotlib.pyplot as plt
count, bins, _ = plt.hist(s, 100, density=True)
fit = a*m**a / bins**(a+1)
plt.plot(bins, max(count)*fit/max(fit), linewidth=2, color='r')
plt.show()

3.まとめ

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる