LogNormal分布のサポート範囲を理解する:PyTorch `torch.distributions.log_normal.LogNormal.support` 属性の秘密


torch.distributions.log_normal.LogNormal.support は、PyTorch の Probability Distributions モジュールにおける LogNormal 分布のサポート範囲を表現する属性です。この属性は、この分布から生成される確率変数の値が許容される範囲を表します。

LogNormal 分布とは

LogNormal 分布は、対数正規分布とも呼ばれ、以下の確率密度関数を持つ連続確率分布です。

f(x) = 1 / (x * sigma * sqrt(2 * pi)) * exp(- (log(x) - mu)^2 / (2 * sigma^2))

ここで、

  • sigma は、分布の標準偏差を表す 対数 値です。
  • mu は、分布の平均値を表す 対数 値です。

サポート範囲

LogNormal 分布のサポート範囲は、x > 0 である必要があります。これは、対数正規分布の確率密度関数が x <= 0 の場合に 0 になるためです。

torch.distributions.log_normal.LogNormal.support 属性

torch.distributions.log_normal.LogNormal.support 属性は、constraints.Positive オブジェクトを返します。これは、サポート範囲が常に正の値であることを保証します。

import torch
from torch.distributions import LogNormal

# 分布を作成
mu = torch.tensor(0.0)
sigma = torch.tensor(1.0)
log_normal = LogNormal(loc=mu, scale=sigma)

# サポート範囲を取得
support = log_normal.support

# サポート範囲を確認
print(support)

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

constraints.Positive()

torch.distributions.log_normal.LogNormal.support 属性は、LogNormal 分布から生成される確率変数の値が許容される範囲を表します。この属性は、分布の性質を理解し、データ分析や機械学習タスクに適切に適用するために重要です。

  • torch.distributions.log_normal.LogNormal.enumerate_support() メソッドを使用して、サポート範囲の要素を列挙することができます。
  • torch.distributions.log_normal.LogNormal.support 属性は、expand 引数を使用して、分布のバッチ次元と一致するようにサポート範囲を拡張することができます。


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

# 分布を作成
mu = torch.tensor(0.0)
sigma = torch.tensor(1.0)
log_normal = LogNormal(loc=mu, scale=sigma)

# サポート範囲を取得
support = log_normal.support

# サポート範囲を可視化
x = torch.linspace(support.lower(), support.upper(), 100)
y = log_normal.pdf(x)

plt.plot(x.numpy(), y.numpy())
plt.xlabel('x')
plt.ylabel('PDF')
plt.title('LogNormal Distribution')
plt.show()

このコードを実行すると、以下のようになります。

  1. ロジスティック分布のオブジェクトを作成します。
  2. support 属性を使用して、分布のサポート範囲を取得します。
  3. linspace 関数を使用して、サポート範囲内の 100 個の等間隔の点を作成します。
  4. 確率密度関数 (PDF) をこれらの点で評価します。
  5. PDF を線グラフで可視化します。

このグラフは、LogNormal 分布の確率密度関数がサポート範囲内でのみ非ゼロであることを示しています。

バッチ次元と一致するようにサポート範囲を拡張する

import torch
from torch.distributions import LogNormal

# 分布を作成
mu = torch.tensor([[0.0], [1.0]])
sigma = torch.tensor([[1.0], [2.0]])
log_normal = LogNormal(loc=mu, scale=sigma)

# サポート範囲を取得
support = log_normal.support

# サポート範囲を拡張
expanded_support = support.expand((2, 100))

# 拡張されたサポート範囲を可視化
x = expanded_support.view(-1)
y = log_normal.pdf(x)

plt.plot(x.numpy(), y.numpy())
plt.xlabel('x')
plt.ylabel('PDF')
plt.title('LogNormal Distribution')
plt.show()

このコードは、expand 引数を使用して、サポート範囲を分布のバッチ次元と一致するように拡張します。

import torch
from torch.distributions import LogNormal

# 分布を作成
mu = torch.tensor(0.0)
sigma = torch.tensor(1.0)
log_normal = LogNormal(loc=mu, scale=sigma)

# サポート範囲を取得
support = log_normal.support

# サポート範囲の要素を列挙
for value in support.enumerate():
    print(value)


代替方法

  1. 手動計算

LogNormal 分布のサポート範囲は、x > 0 であることがわかっています。したがって、サポート範囲を手動で計算するには、以下の式を使用できます。

import torch

lower_bound = torch.tensor(0.0)
upper_bound = torch.tensor(inf)

ここで、inf は正の無限大を表す数値です。

  1. torch.distributions.constraints.Positive オブジェクトを使用する

torch.distributions.constraints.Positive オブジェクトは、サポート範囲が常に正の値であることを保証します。以下のコードは、Positive オブジェクトを使用して、LogNormal 分布のサポート範囲を表現する方法を示しています。

import torch
from torch.distributions import constraints
from torch.distributions import LogNormal

# 分布を作成
mu = torch.tensor(0.0)
sigma = torch.tensor(1.0)
log_normal = LogNormal(loc=mu, scale=sigma)

# サポート範囲を作成
support = constraints.Positive()
  1. torch.where 関数を使用する

torch.where 関数を使用して、条件に応じて異なる値を返すことができます。以下のコードは、where 関数を使用して、LogNormal 分布のサポート範囲を表現する方法を示しています。

import torch

lower_bound = torch.tensor(0.0)
support = torch.where(torch.tensor(True), lower_bound, torch.tensor(-inf))

それぞれの方法の長所と短所

  • torch.where 関数を使用する
    柔軟性がありますが、他の方法よりも冗長になる可能性があります。
  • Positive オブジェクトを使用する
    簡潔で、サポート範囲が常に正の値であることを保証します。
  • 手動計算
    最も単純な方法ですが、冗長になる可能性があります。

torch.distributions.log_normal.LogNormal.support 属性の代替方法はいくつかあります。状況に応じて、最適な方法を選択してください。

  • 上記の代替方法は、他の分布にも適用できます。
  • LogNormal 分布の場合、サポート範囲は x > 0 です。
  • サポート範囲は、確率密度関数が非ゼロである範囲を表します。