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
を使用してください。 - 精度が最優先事項の場合は、サンプリングベースの方法を検討してください。
- 計算速度が最優先事項の場合は、手動計算または近似値の使用を検討してください。
- サンプリングベースの方法を使用する場合は、サンプル数の適切な選択が重要です。サンプル数が少なすぎると、推定値の精度が低くなります。逆に、サンプル数が多すぎると、計算コストが高くなります。