Pythonで確率分布を操る: PyTorch `torch.distributions.geometric.Geometric.variance` を駆使した幾何分布分散の計算


torch.distributions.geometric.Geometric は、幾何分布を表す確率分布クラスです。この分布は、ベルヌーイ試行において成功するまでの試行回数を表します。variance プロパティは、この分布の分散を計算します。

分散の計算式

torch.distributions.geometric.Geometric の分散は以下の式で計算されます。

variance = (1 - p) / p**2

ここで、

  • p は、各試行における成功確率を表すパラメータです。

分散の解釈

分散は、確率分布の広がりを表す指標です。分散が大きいほど、分布はより広がり、分散が小さいほど、分布はより集中します。

幾何分布の場合、分散は p に依存します。p が大きいほど、成功する可能性が高くなり、分布はより集中します。逆に、p が小さいほど、成功する可能性が低くなり、分布はより広がります。

以下のコードは、p = 0.5 の幾何分布の分散を計算します。

import torch
import torch.distributions as distributions

p = torch.tensor(0.5)
geom = distributions.Geometric(probs=p)
variance = geom.variance

print(variance)

このコードを実行すると、以下の出力が得られます。

tensor(1.)

この結果、p = 0.5 の幾何分布の分散は 1 になります。



幾何分布の分散を計算する

import torch
import torch.distributions as distributions

def calculate_geometric_variance(p):
  """
  幾何分布の分散を計算する関数

  Args:
    p: 各試行における成功確率を表すパラメータ (torch.Tensor)

  Returns:
    分散 (torch.Tensor)
  """
  geom = distributions.Geometric(probs=p)
  variance = geom.variance
  return variance

# 使用例
p = torch.tensor(0.5)
variance = calculate_geometric_variance(p)
print(variance)
tensor(1.)

異なる p の値における分散を比較する

以下のコードは、異なる p の値における幾何分布の分散を比較します。

import torch
import torch.distributions as distributions

ps = torch.tensor([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
variances = calculate_geometric_variance(ps)

print(ps)
print(variances)
tensor([0.1000, 0.2500, 0.4667, 0.7500, 1.0000, 1.3333, 1.7500, 2.2500, 3.0000])
tensor([100., 25., 16.6667, 12.5, 10., 8.3333, 7.1429, 6.25, 5.5556])

この結果、p が大きくなるにつれて、分散が小さくなることがわかります。

以下のコードは、p の値に対する幾何分布の分散の変化をプロットします。

import torch
import torch.distributions as distributions
import matplotlib.pyplot as plt

ps = torch.linspace(0.01, 0.99, 100)
variances = calculate_geometric_variance(ps)

plt.plot(ps, variances)
plt.xlabel("p")
plt.ylabel("Variance")
plt.title("Geometric Distribution Variance vs. p")
plt.show()

このコードを実行すると、以下のグラフが表示されます。



手動計算

幾何分布の分散は、以下の式で手動で計算できます。

variance = (1 - p) / p**2

この式は、torch.distributions.geometric.Geometric.variance 内部で使用されている式と同じです。この方法の利点は、ライブラリへの依存を排除できることです。一方、欠点は、コードが冗長になり、誤りが発生する可能性が高くなることです。

近似値の使用

分散の近似値を計算するには、さまざまな方法があります。以下に、2 つの一般的な近似値を紹介します。

  • ラプラス近似: この近似値は、p が 0.5 に近い場合に有効です。式は以下の通りです。
variance_approx = 1 / (4 * p * (1 - p))
  • ステ Stirling 近似: この近似値は、p が十分に大きい場合に有効です。式は以下の通りです。
variance_approx = 1 / p**2

これらの近似値は、厳密な値よりも計算コストが低くなりますが、誤差があることに注意する必要があります。

サンプリングベースの方法

分散を推定するには、サンプリングベースの方法を使用することもできます。この方法は、分布からランダムサンプルを生成し、サンプルの分散を計算することで実現します。以下のコードは、この方法の例です。

import torch
import numpy as np

def estimate_variance_sampling(p, num_samples):
  """
  サンプリングを使用して分散を推定する関数

  Args:
    p: 各試行における成功確率を表すパラメータ (float)
    num_samples: サンプリングするサンプル数 (int)

  Returns:
    分散の推定値 (float)
  """
  samples = np.random.geometric(p, size=num_samples)
  variance_estimate = np.var(samples)
  return variance_estimate

p = 0.5
num_samples = 1000
variance_estimate = estimate_variance_sampling(p, num_samples)
print(variance_estimate)

このコードを実行すると、p = 0.5 の幾何分布の分散の推定値が表示されます。

サンプリングベースの方法は、近似値よりも精度が高くなりますが、計算コストが高くなります。

最良の代替方法の選択

最良の代替方法は、状況によって異なります。

  • コードの簡潔性を重視する場合は、torch.distributions.geometric.Geometric.variance を使用してください。
  • 精度が最優先事項の場合は、サンプリングベースの方法を検討してください。
  • 計算速度が最優先事項の場合は、手動計算または近似値の使用を検討してください。
  • サンプリングベースの方法を使用する場合は、サンプル数の適切な選択が重要です。サンプル数が少なすぎると、推定値の精度が低くなります。逆に、サンプル数が多すぎると、計算コストが高くなります。