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

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

対数正規分布とは、その名の通り、正規分布の対数分布です。もし x が対数正規分布なら、log(x) は正規分布です。たとえば収入・資産の分布や体重の分布などは、この対数正規分布に似通っていると言われています。

なお正規分布については、以下で解説しています。

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

目次

1. 書式

Generator.lognormal

書き方:

Generator.lognormal(mean=0.0, sigma=1.0, size=None)

パラメーター:

mean: float or array_like of floats, optional
平均値μ。デフォルト値は0。
sigma: float or array_like of floats, optional
標準偏差σ。デフォルト値は1。
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合で、かつ、mean, sigmaがともにスカラーの場合、1つの乱数の値を返す。それ以外の場合は、np.broadcast(mean, sigma).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 0x7F89ED6EA4F8

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

第一引数に平均値μ、第二引数に標準偏差σ、第三引数に出力する配列のsizeを指定します。

In [2]:
rng.lognormal(3., 1., 5)
Out[2]:
array([37.51181439, 60.64615862, 18.78854235, 16.23294514, 19.4807788 ])

対数正規分布の確率密度関数に沿ってヒストグラムを確認してみましょう。この分布は、以下のような形状をしています。

In [3]:
mu, sigma = 3., 1.
s = rng.lognormal(mu, sigma, 1000)

import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 100, density=True, align='mid')

x = np.linspace(min(bins), max(bins), 10000)
pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
       / (x * sigma * np.sqrt(2 * np.pi)))

plt.plot(x, pdf, linewidth=2, color='r')
plt.axis('tight')
plt.show()

冒頭で解説した通り、正規分布から取得した乱数の積を取ると、対数正規分布の確率密度関数とよくフィットします。

In [4]:
# 1000の乱数を生成
# それぞれが正規分布から取得した100個の値の積
b = []
for i in range(1000):
   a = 10. + rng.standard_normal(100)
   b.append(np.product(a))
    
b = np.array(b) / np.min(b) # 正の値に調整
count, bins, ignored = plt.hist(b, 100, density=True, align='mid')
sigma = np.std(np.log(b))
mu = np.mean(np.log(b))

x = np.linspace(min(bins), max(bins), 10000)
pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2))
       / (x * sigma * np.sqrt(2 * np.pi)))

plt.plot(x, pdf, color='r', linewidth=2)
plt.show()

3. まとめ

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

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

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

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

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

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

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

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

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる