Generator.logseries – 対数分布から乱数配列を作成する方法

Generator.logseriesは、対数分布から乱数配列を生成するジェネレータメソッドです。

対数分布は、種の多様性や発生を表す分布として頻繁に使われます。また、車の乗車人数のモデルとしても使われます。

ここでは、対数分布から乱数配列を生成するGenerator.logseriesについて解説します。

目次

1. 書式

Generator.logseries

書き方:

Generator.logseries(p, size=None)

パラメーター:

p: float or array_like of floats
分布の形状を指定するパラメータ(0<p<1)
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合で、pがスカラーの場合、1つの乱数の値を返す。それ以外の場合は、np.array(p).sizeの乱数を生成する。

戻り値: 

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

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

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

第一引数にパラメータp、第二引数にsizeを指定します。

In [2]:
rng.logseries(.8, 5)
Out[2]:
array([5, 9, 1, 2, 1])

異なるpを指定した場合の、確率密度関数とヒストグラムを確認しておきましょう。対数分布は次のような形状をしています。

In [3]:
import matplotlib.pyplot as plt

def logseries(k, p):
    return -p**k/(k*np.log(1-p))

plt.subplot(221)
a = .2
s = rng.logseries(a, 10000)
count, bins, ignored = plt.hist(s)
plt.plot(bins, logseries(bins, a) * count.max()/
         logseries(bins, a).max(), 'r')
plt.title('a=.2', fontsize=12)

plt.subplot(222)
a = .4
s = rng.logseries(a, 10000)
count, bins, ignored = plt.hist(s)
plt.plot(bins, logseries(bins, a) * count.max()/
         logseries(bins, a).max(), 'r')
plt.title('a=.4', fontsize=12)

plt.subplot(223)
a = .6
s = rng.logseries(a, 10000)
count, bins, ignored = plt.hist(s)
plt.plot(bins, logseries(bins, a) * count.max()/
         logseries(bins, a).max(), 'r')
plt.title('a=.6', fontsize=12)

plt.subplot(224)
a = .8
s = rng.logseries(a, 10000)
count, bins, ignored = plt.hist(s)
plt.plot(bins, logseries(bins, a) * count.max()/
         logseries(bins, a).max(), 'r')
plt.title('a=.8', fontsize=12)


plt.tight_layout()
plt.show()

3. まとめ

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる