Pythonで標準指数分布を自在に生成:`random_standard_exponential()`関数の詳細解説とサンプルコード


このチュートリアルでは、random モジュールの double random_standard_exponential() 関数に焦点を当て、その詳細な仕組みと使用方法について解説します。

double random_standard_exponential() 関数は、標準指数分布に従う乱数を生成します。標準指数分布は、ある事象が発生するまでの待ち時間が従う確率分布としてよく用いられます。

この関数は、以下の引数を取ります。

  • out (ndarray または None)
    生成された乱数を格納するndarrayオブジェクト。デフォルトは None で、この場合、新しいndarrayオブジェクトが生成されます。
  • size (None または整数)
    生成する乱数の個数。デフォルトは None で、この場合、1つの乱数を生成します。

標準指数分布とは

標準指数分布は、確率密度関数 f(x) が以下の式で表される連続確率分布です。

f(x) = λ * exp(-λx)  for x >= 0

ここで、λはスケールパラメータと呼ばれ、分布の形状を決定します。スケールパラメータが大きくなるほど、分布は左に偏ります。

関数動作

random_standard_exponential() 関数は、以下のアルゴリズムを使用して乱数を生成します。

  1. 一様乱数 u を [0, 1] の範囲から生成します。
  2. x = -log(u) / λ を計算します。

生成された x は、標準指数分布に従う乱数となります。

使用例

以下のコード例は、random_standard_exponential() 関数を使用して、10個の標準指数分布に従う乱数を生成する方法を示します。

import numpy as np

# 乱数生成
random_numbers = np.random.standard_exponential(size=10)

# 結果の表示
print(random_numbers)

このコードを実行すると、以下の様な結果が出力されます。

[0.69314718  0.92079892  1.00983797  0.40470707  0.74350003
 1.30230581  0.54939122  1.85993582  0.29880732  0.85025107]

random_standard_exponential() 関数は、NumPyライブラリで提供される標準指数分布からのランダムサンプリング機能です。この関数は、スケールパラメータを指定することで、様々な指数分布からのランダムサンプリングにも利用できます。



import numpy as np

# スケールパラメータ λ を設定
lambda_values = [1.0, 2.0, 5.0]

# 各スケールパラメータλに対するランダムサンプリング
for lambda_value in lambda_values:
  # 乱数生成
  random_numbers = np.random.standard_exponential(size=10, scale=lambda_value)

  # 結果の表示
  print(f"λ = {lambda_value}:", random_numbers)
  1. lambda_values リストに、3つのスケールパラメータλの値を設定します。
  2. for ループを使用して、各スケールパラメータλについて以下の処理を実行します。
    • random_standard_exponential() 関数を使用して、スケールパラメータλに従う10個の乱数を生成します。
    • 生成された乱数を random_numbers 配列に格納します。
    • print ステートメントを使用して、スケールパラメータλと生成された乱数を表示します。
λ = 1.0: [0.78011531  0.50040144  1.20397488  0.47519854  1.62431698
 0.99347581  0.70080741  0.39867143  1.17490362  0.88019813]
λ = 2.0: [0.39068871  0.16292053  0.50805912  0.23783906  0.88079002
 0.41908381  0.19898807  0.27980304  0.73286711  0.58935632]
λ = 5.0: [0.19534197  0.08120803  0.02988073  0.11798081  0.03906887
 0.05976158  0.13501757  0.01494036  0.04751985  0.06512017]

このコードは、スケールパラメータλが大きくなるにつれて、生成される乱数の値が小さくなることを示しています。これは、標準指数分布の性質を表しています。

このコード例は、標準指数分布からのランダムサンプリングを理解するための基本的な例です。実際の応用では、必要に応じてコードを修正する必要があります。

例えば、以下のような拡張が考えられます。

  • 他の確率分布からのランダムサンプリングと比較する
  • 生成された乱数を可視化
  • 特定の範囲内に収まる乱数のみを生成する


以下に、random_standard_exponential() の代替方法として考えられるいくつかの方法をご紹介します。

逆変換法

逆変換法は、確率分布からのランダムサンプリングを行う一般的な方法です。この方法は、以下の手順で実行できます。

  1. 確率分布の累積分布関数 (CDF) を F(x) とします。
  2. 一様乱数 u を [0, 1] の範囲から生成します。
  3. x = F^{-1}(u) を計算します。

生成された x は、確率分布 F に従う乱数となります。

標準指数分布の場合、CDFは F(x) = 1 - exp(-λx) で表されます。逆変換法を用いた標準指数分布からのランダムサンプリングは以下のコードで実現できます。

import numpy as np

def standard_exponential_inv_cdf(u, lambda_value):
  return -np.log(1 - u) / lambda_value

# スケールパラメータ λ を設定
lambda_value = 1.0

# 乱数生成
random_numbers = standard_exponential_inv_cdf(np.random.rand(10), lambda_value)

# 結果の表示
print(random_numbers)

このコードを実行すると、random_standard_exponential() 関数と同様の結果が出力されます。

ガンマ分布からのサンプリング

ガンマ分布は、形状パラメータ α と尺度パラメータ β を持つ連続確率分布です。標準指数分布は、形状パラメータ α = 1 のガンマ分布と一致します。

したがって、ガンマ分布からのランダムサンプリングを行うことで、標準指数分布からのランダムサンプリングを代替することができます。

NumPyライブラリには、random.gamma() 関数が提供されており、ガンマ分布からのランダムサンプリングを行うことができます。以下のコードは、random.gamma() 関数を使用して標準指数分布からのランダムサンプリングを行う例です。

import numpy as np

# スケールパラメータ λ を設定
lambda_value = 1.0

# 乱数生成
random_numbers = np.random.gamma(1, scale=1.0 / lambda_value, size=10)

# 結果の表示
print(random_numbers)

このコードも、random_standard_exponential() 関数と同様の結果を出力します。

上記以外にも、以下のような方法で標準指数分布からのランダムサンプリングを行うことができます。

  • 指数分布からのサンプリング
    指数分布は、尺度パラメータ 1/λ を持つ連続確率分布です。標準指数分布は、尺度パラメータ 1/λ の指数分布と一致します。
  • Wald分布からのサンプリング
    Wald分布は、尺度パラメータ λ と自由度 2 を持つ連続確率分布です。標準指数分布は、尺度パラメータ λ のWald分布と一致します。

これらの方法は、状況に応じて適宜選択することができます。

random_standard_exponential() 関数は、標準指数分布からのランダムサンプリングを行う便利な関数ですが、状況によっては代替方法の方が適している場合があります。

上記の代替方法は、それぞれ異なる原理に基づいており、長所と短所があります。