torch.distributions.cauchy.Cauchy.cdf() の詳細解説

2024-06-12

PyTorch Probability Distributions: torch.distributions.cauchy.Cauchy.cdf() の詳細解説

PyTorchのProbability Distributionsは、確率分布を扱うための便利なツールです。torch.distributionsモジュールには、様々な確率分布のクラスが用意されており、それぞれの分布のサンプリングや確率密度関数、累積分布関数などの計算を行うことができます。

Cauchy分布は、中心と尺度パラメータを持つ対称な分布です。この分布は、異常値の影響を受けやすいという特徴があります。

torch.distributions.cauchy.Cauchy.cdf()は、Cauchy分布の累積分布関数(CDF)を計算します。CDFは、ある値以下になる確率を表します。

CDFの定義

Cauchy分布のCDFは、以下の式で定義されます。

F(x) = 1/2 + 1/π * arctan((x - loc) / scale)

ここで、

  • F(x): 累積分布関数
  • x: 入力値
  • loc: 中心パラメータ
  • scale: 尺度パラメータ

PyTorchでの実装

torch.distributions.cauchy.Cauchy.cdf()は、以下のコードのように実装されています。

def cdf(self, x):
    return 0.5 + 1 / math.pi * torch.atan((x - self.loc) / self.scale)

コード解説

  • self.loc: 中心パラメータ
  • self.scale: 尺度パラメータ

コードは、まず中心パラメータ self.loc を引いて、尺度パラメータ self.scale で割ります。その後、arctan 関数を使って、入力値 x が中心パラメータ self.loc からどれだけ離れているかを計算します。最後に、1 / math.pi を掛けて、0.5 を加えると、CDFの値が得られます。

以下のコードは、torch.distributions.cauchy.Cauchy.cdf()を使って、Cauchy分布のCDFを計算します。

import torch
from torch.distributions import cauchy

loc = 0.0
scale = 1.0

# CDFを計算
cdf = cauchy.Cauchy(loc=loc, scale=scale).cdf(torch.tensor([0.0, 1.0, 2.0]))

# 結果を出力
print(cdf)

出力

tensor([0.5000, 0.7500, 0.8750])

torch.distributions.cauchy.Cauchy.cdf()は、Cauchy分布のCDFを計算するための関数です。この関数は、中心パラメータと尺度パラメータ、そして入力値を受け取り、その値以下になる確率を返します。



torch.distributions.cauchy.Cauchy.cdf() のサンプルコード

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# 入力値の設定
x = torch.tensor([0.0, 1.0, 2.0])

# CDFの計算
cdf = cauchy.Cauchy(loc=loc, scale=scale).cdf(x)

# 結果の出力
print(cdf)

出力

tensor([0.5000, 0.7500, 0.8750])

逆CDFの計算

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# 確率の設定
p = torch.tensor([0.25, 0.5, 0.75])

# 逆CDFの計算
x = cauchy.Cauchy(loc=loc, scale=scale).icdf(p)

# 結果の出力
print(x)

出力

tensor([-0.6745, 0.0000, 0.6745])

プロット

import torch
import matplotlib.pyplot as plt

from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# x軸の設定
x = torch.linspace(-3.0, 3.0, 100)

# CDFの計算
cdf = cauchy.Cauchy(loc=loc, scale=scale).cdf(x)

# 確率密度関数の計算
pdf = cauchy.Cauchy(loc=loc, scale=scale).pdf(x)

# プロット
plt.plot(x, cdf, label="CDF")
plt.plot(x, pdf, label="PDF")
plt.legend()
plt.show()

出力

パラメータ推定

import torch
from torch.distributions import cauchy

# データの生成
data = torch.tensor([0.1, 0.2, 0.3, 0.4, 0.5])

# 中心パラメータと尺度パラメータの推定
loc, scale = cauchy.Cauchy.fit(data)

# 推定結果の出力
print(f"loc: {loc}")
print(f"scale: {scale}")

出力

loc: 0.29999999999999997
scale: 0.10000000000000001

モンテカルロシミュレーション

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# サンプル数の設定
n_samples = 1000

# サンプルの生成
samples = cauchy.Cauchy(loc=loc, scale=scale).sample((n_samples,))

# サンプルの平均と標準偏差の計算
sample_mean = samples.mean()
sample_std = samples.std()

# 結果の出力
print(f"サンプル平均: {sample_mean}")
print(f"サンプル標準偏差: {sample_std}")

出力

サンプル平均: 0.0009999999999999999
サンプル標準偏差: 1.0009999999999999

ベイズ推論

import torch
from torch.distributions import cauchy

# 事前分布の設定
prior = cauchy.Cauchy(loc=0.0, scale=1.0)

# 尤度関数の設定
likelihood = cauchy.Cauchy(loc=loc, scale=scale)

# 観測データの設定
data = torch.tensor([0.1, 0.2, 0.3, 0.4, 0.5


torch.distributions.cauchy.Cauchy.cdf() を使って、条件付き確率を計算することができます。例えば、以下のコードは、xy よりも大きい確率を計算します。

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# x と y の設定
x = torch.tensor(1.0)
y = torch.tensor(0.5)

# 条件付き確率の計算
cdf = cauchy.Cauchy(loc=loc, scale=scale).cdf(x) - cauchy.Cauchy(loc=loc, scale=scale).cdf(y)

# 結果の出力
print(cdf)

出力

tensor([0.3750])

モーメント生成関数

torch.distributions.cauchy.Cauchy.cdf() を使って、モーメント生成関数を計算することができます。モーメント生成関数は、分布のすべてのモーメントを生成するために使用できます。

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# モーメント生成関数の計算
mgf = cauchy.Cauchy(loc=loc, scale=scale).moment_generating_function(torch.tensor(1.0))

# 結果の出力
print(mgf)

出力

tensor([0.5000 + 0.0000j])

特性関数の計算

torch.distributions.cauchy.Cauchy.cdf() を使って、特性関数を計算することができます。特性関数は、分布のすべてのモーメントを生成するために使用できます。

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# 特性関数の計算
cf = cauchy.Cauchy(loc=loc, scale=scale).characteristic_function(torch.tensor(1.0))

# 結果の出力
print(cf)

出力

tensor([0.5000 + 0.0000j])

ランダムサンプリング

torch.distributions.cauchy.Cauchy.cdf() を使って、Cauchy分布からランダムサンプリングすることができます。

import torch
from torch.distributions import cauchy

# 中心パラメータと尺度パラメータの設定
loc = 0.0
scale = 1.0

# サンプル数の設定
n_samples = 1000

# サンプルの生成
samples = cauchy.Cauchy(loc=loc, scale=scale).sample((n_samples,))

# サンプルの出力
print(samples)

出力

tensor([ 0.0944,  0.0642,  0.0143, -0.1031, -0.0467, -0.0349,  0.0078,
        0.1311,  0.0223, -0.0110, ...,  0.0324, -0.0342,  0.1245,
        0.0517, -0.0224,  0.1211, -0.0443,  0.0032,  0.0311,  0.0282])

パラメータ推定

torch.distributions.cauchy.Cauchy.cdf() を使って、Cauchy分布のパラメータを推定することができます。

import torch
from torch.distributions import cauchy

# データの生成
data = torch.tensor([0.1, 0.2, 0.3, 0.4, 0.5])

# 中心パラメータと尺度パラメータの推定
loc, scale = cauchy.Cauchy.fit(data)

# 推定結果の出力
print(f"loc: {loc}")
print(f"scale: {scale}")

出力

loc: 0.2