NumPy Random Samplingにおけるrandom.lognormal()解説

2024-04-02

NumPyのRandom Samplingにおけるrandom.lognormal()解説

NumPyのrandom.lognormal()は、対数正規分布に従う乱数を生成する関数です。対数正規分布とは、変数の対数が正規分布に従う確率分布です。言い換えると、データの対数を正規分布に当てはめると、そのデータは対数正規分布に従うということになります。

使い方

random.lognormal()は以下の引数を受け取ります。

  • mean (float): 対数平均
  • sigma (float): 対数標準偏差
  • size (int or tuple): 生成する乱数の形状

例:

import numpy as np

# 平均0、標準偏差1の対数正規分布から10個の乱数を生成
random_numbers = np.random.lognormal(0, 1, 10)

# 結果を出力
print(random_numbers)

出力例

[ 1.23456789  0.87654321  2.34567890  1.00000000  0.76543210
  1.23456789  0.87654321  2.34567890  1.00000000  0.76543210]

対数正規分布の性質

  • データが右 skewed な場合によく用いられる
  • 平均と標準偏差だけでなく、形状もパラメータとして指定できる
  • 金融データや生物学データなど、様々な分野で利用されている

補足

  • random.lognormal()は、np.random.lognormal()と同じ

関連関数

  • random.rand():0から1までの乱数を生成
  • random.randn():平均0、標準偏差1の正規分布に従う乱数を生成
  • random.normal():指定された平均と標準偏差を持つ正規分布に従う乱数を生成


NumPy random.lognormal サンプルコード

import numpy as np

# 平均0、標準偏差1の対数正規分布から10個の乱数を生成
random_numbers = np.random.lognormal(0, 1, 10)

# 結果を出力
print(random_numbers)

形状を指定して乱数を生成

# (3, 5)の形状を持つ、平均0、標準偏差1の対数正規分布から乱数を生成
random_numbers = np.random.lognormal(0, 1, (3, 5))

# 結果を出力
print(random_numbers)

対数正規分布の確率密度関数を表示

import matplotlib.pyplot as plt

# 平均0、標準偏差1の対数正規分布の確率密度関数
x = np.linspace(0.1, 10, 100)
y = np.random.lognormal(0, 1, x.shape)

# グラフを表示
plt.plot(x, y)
plt.show()

対数正規分布に従うデータの生成

# 平均0、標準偏差1の対数正規分布に従うデータ100個を生成
data = np.random.lognormal(0, 1, 100)

# データの統計量を出力
print("平均:", np.mean(data))
print("標準偏差:", np.std(data))
print("最小値:", np.min(data))
print("最大値:", np.max(data))

対数正規分布のQQプロット

import scipy.stats as stats

# 平均0、標準偏差1の対数正規分布に従うデータ100個を生成
data = np.random.lognormal(0, 1, 100)

# QQプロットを表示
stats.probplot(data, dist="lognorm", plot=plt)
plt.show()


対数正規分布に従う乱数を生成する他の方法

Box-Muller変換は、正規分布に従う乱数から対数正規分布に従う乱数を生成する方法です。

def box_muller(mean, sigma, size):
  # 正規分布に従う乱数を生成
  z1 = np.random.rand(size)
  z2 = np.random.rand(size)

  # Box-Muller変換
  u = np.sqrt(-2.0 * np.log(z1)) * np.cos(2.0 * np.pi * z2)
  v = np.sqrt(-2.0 * np.log(z1)) * np.sin(2.0 * np.pi * z2)

  # 対数正規分布に従う乱数
  x = mean + sigma * u
  y = np.exp(v)

  return x, y

# 平均0、標準偏差1の対数正規分布から10個の乱数を生成
x, y = box_muller(0, 1, 10)

# 結果を出力
print(x)
print(y)

逆変換法は、対数正規分布の累積分布関数を逆関数にして乱数を生成する方法です。

def inverse_transform(mean, sigma, size):
  # 対数正規分布の累積分布関数
  cdf = lambda x: 0.5 * (1.0 + erf((np.log(x) - mean) / (sigma * np.sqrt(2.0))))

  # 逆変換
  u = np.random.rand(size)
  x = cdf(u)

  return x

# 平均0、標準偏差1の対数正規分布から10個の乱数を生成
x = inverse_transform(0, 1, 10)

# 結果を出力
print(x)

近似法

対数正規分布は、正規分布やガンマ分布などの他の分布で近似することができます。

# 正規分布による近似
def normal_approximation(mean, sigma, size):
  x = np.random.normal(mean, sigma, size)
  y = np.exp(x)

  return y

# ガンマ分布による近似
def gamma_approximation(mean, sigma, size):
  shape = (sigma**2) / (mean**2)
  scale = mean / shape
  x = np.random.gamma(shape, scale, size)

  return x

# 平均0、標準偏差1の対数正規分布から10個の乱数を生成
x = normal_approximation(0, 1, 10)
y = gamma_approximation(0, 1, 10)

# 結果を出力
print(x)
print(y)

それぞれの方法の比較

方法メリットデメリット
random.lognormal()高速精度が低い場合がある
Box-Muller変換精度が高い遅い
逆変換法精度が高い複雑
近似法高速精度が低い場合がある

random.lognormal()は、対数正規分布に従う乱数を生成する最も簡単な方法です。ただし、精度が低い場合があるため、より精度の高い方法が必要な場合は、他の方法を検討する必要があります。




Pythonプログラマー必見!NumPy static ma.MaskedArray.__new__(): データ分析をレベルアップ

static ma. MaskedArray. __new__() は、ma. MaskedArray オブジェクトを作成するための静的メソッドです。このメソッドは、データ、マスク、およびオプションのデータ型を指定して、新しい ma. MaskedArray オブジェクトを作成します。



C言語からNumPyの64ビット整数型にアクセス: npy_longlong 型詳細解説

npy_longlongの概要C言語のlong long型に対応するNumPyの整数型です。64ビット長の整数値を表現できます。Pythonのint型よりも大きな値を扱う場合に使用します。npy_longlongの主な用途大きな配列のインデックスとして使用できます。


NumPy C-API: void PyArray_UpdateFlags() 関数徹底解説

void PyArray_UpdateFlags(PyArrayObject *arr, int flagmask)引数 arr: 更新対象の NumPy 配列オブジェクトへのポインタ flagmask: 更新するフラグのビットマスク引数


NumPy C-API を用いたメモリ管理: void PyDimMem_FREE() 関数を中心に

void PyDimMem_FREE() は、NumPy C-API におけるメモリ管理関数の一つで、NumPy 配列のメモリ割り当てを解除します。機能NumPy 配列が保持するメモリブロックを解放します。配列がヌルポインタの場合は無効です。


NumPy C-API:UFUNC_MASK_OVERFLOWフラグの真偽:オーバーフロー処理のベストプラクティス

UFUNCは、NumPyにおける汎用関数を指します。加算、減算、乗算、除算などの基本的な数学演算から、三角関数、統計関数など、様々な関数がUFUNCとして提供されています。UFUNC_MASK_OVERFLOWフラグは、UFUNCの演算結果がオーバーフローした場合の動作を制御します。具体的には、以下の2つの動作を設定できます。



record.argsort() を使いこなして、NumPy Standard Array Subclasses の構造化配列を自在に操る

NumPy の record. argsort() は、構造化配列(record array)の要素を、指定されたフィールドに基づいてソートする際に使用する関数です。Standard array subclasses は、NumPy の基本的な配列型 (ndarray) を拡張したものであり、record


NumPy Data type routines: obj2sctype() 関数

numpy. obj2sctype()関数は、オブジェクトの型を、NumPyのデータ型またはスカラ型に変換します。これは、NumPy配列にオブジェクトを格納したり、オブジェクトの型をNumPyのデータ型と比較したりする際に役立ちます。引数obj: オブジェクト


NumPy User Guideにおける PyModule_AddStringConstant() プログラミング

int PyModule_AddStringConstant() 関数は、NumPyのC APIでモジュールに文字列定数を追加するために使用されます。これは、モジュールのバージョン情報やその他のメタデータをエンコードする際に役立ちます。詳細


NumPyで配列を完璧に比較する: numpy.array_equal() 関数の詳細解説とサンプルコード集

機能概要:2つの入力配列 arr1 と arr2 を受け取ります。配列の形状と要素を逐一比較し、一致しているかどうかを判定します。一致していれば True、そうでなければ False を返します。構文:引数:arr1: 比較対象となる最初の配列


setastest() でテストスイートをカスタマイズ: NumPy テストの高度なテクニック

setastest() は以下の引数を受け取ります。test_mode: テストスイート全体または個々のテストケースに対して設定するテストモードverbosity: テスト実行時の出力レベルraise_warnings: テスト実行時に警告を発生させるかどうか