はじめに
機械学習で登場する確率分布について色々な角度から理解したいシリーズです。
この記事では、R言語でベータ分布の計算を行います。
【前の内容】
【他の記事一覧】
【この記事の内容】
ベータ分布の計算
ベータ分布(Beta Distribution)の確率密度と統計量を計算します。
確率密度の計算
ベータ分布に従う確率密度を計算する方法をいくつか確認します。
パラメータの設定
まずは、ベータ分布のパラメータ$\alpha, \beta$と確率変数の実現値$\phi$を設定します。
# パラメータを指定 alpha <- 5 beta <- 2 # 確率変数の値を指定 phi <- 0.6
2つのパラメータ$\alpha > 0, \beta > 0$、0から1の値$0 < \phi < 1$を指定します。設定した値に従う確率密度を計算します。$\phi$がとり得る範囲外の値の場合は、確率密度が0になります。
スクラッチで計算
定義式から計算します。
# 定義式により確率密度を計算 C <- gamma(alpha + beta) / gamma(alpha) / gamma(beta) dens <- C * phi^(alpha - 1) * (1 - phi)^(beta - 1) dens
## [1] 1.5552
ベータ分布は、次の式で定義されます。
ここで、$C_{\mathrm{Beta}}$はベータ分布の正規化係数、$\Gamma(x)$はガンマ関数です。
ガンマ関数は、gamma()
で計算できます。
対数をとった定義式から計算します。
# 対数をとった定義式により確率密度を計算 log_C <- lgamma(alpha + beta) - lgamma(alpha) - lgamma(beta) log_dens <- log_C + (alpha - 1) * log(phi) + (beta - 1) * log(1 - phi) dens <- exp(log_dens) dens; log_dens
## [1] 1.5552 ## [1] 0.4416042
対数をとった定義式を計算します。
対数をとったガンマ関数は、lgamma()
で計算できます。引数の値が大きいとgamma()
の計算結果が発散してしまいます。その場合でも、lgamma()
で計算できます。
計算結果の指数をとると確率密度が得られます。
指数と対数の性質より$\exp(\log x) = x$です。
次は、関数を使って確率密度を計算します。
ベータ分布の関数による計算
ベータ分布の確率密度関数dbeta()
で計算します。
# ベータ分布の関数により確率密度を計算 dens <- dbeta(x = phi, shape1 = alpha, shape2 = beta) dens
## [1] 1.5552
確率変数の引数x
にphi
、パラメータの引数shape1, shape2
にalpha, beta
を指定します。
log = TRUE
を指定すると対数をとった確率密度を返します。
# ベータ分布の対数をとった関数により確率密度を計算 log_dens <- dbeta(x = phi, shape1 = alpha, shape2 = beta, log = TRUE) dens <- exp(log_dens) dens; log_dens
## [1] 1.5552 ## [1] 0.4416042
計算結果の指数をとると確率密度が得られます。
ディリクレ分布の関数による計算
以降の計算は、変数とパラメータをベクトル形式にしておく必要があります。
# ベクトルに変換 alpha_v <- c(alpha, beta) phi_v <- c(phi, 1 - phi) alpha_v; phi_v
## [1] 5 2 ## [1] 0.6 0.4
2つのパラメータをベクトルにまとめてalpha_v
とします。
成功確率(クラス1の出現確率)$\phi$と失敗確率(クラス0の出現確率)$1 - \phi$をベクトルにまとめてphi_v
とします。
「alpha
とphi
」「beta
と1-phi
」のインデックスが対応していれば、順番は計算結果に影響しません。
MCMCpack
パッケージのディリクレ分布の確率密度関数ddirichlet()
で計算します。
# ディリクレ分布の関数により確率密度を計算 dens <- MCMCpack::ddirichlet(x = phi_v, alpha = alpha_v) dens
## [1] 1.5552
確率変数の引数x
にphi_v
、パラメータの引数alpha
にalpha_v
を指定します。$V = 2$のときベータ分布の確率密度になります。
統計量の計算
次は、ベータ分布の期待値・分散・最頻値を計算します。詳しくは「1.2.3:ベータ分布【『トピックモデル』の勉強ノート】 - からっぽのしょこ」を参照してください。
期待値を計算します。
# 期待値を計算 E_phi <- alpha / (alpha + beta) E_phi
## [1] 0.7142857
ベータ分布の期待値は、次の式で計算できます。
分散を計算します。
# 分散を計算 V_phi <- alpha * beta / (alpha + beta)^2 / (alpha + beta + 1) V_phi
## [1] 0.0255102
ベータ分布の分散は、次の式で計算できます。
最頻値を計算します。
# 最頻値を計算 mode_phi <- (alpha - 1) / (alpha + beta - 2) mode_phi
## [1] 0.8
ベータ分布の最頻値(モード)は、次の式で計算できます。
歪度と尖度の計算
最後に、ベータ分布の歪度と尖度を計算します。詳しくはいつか書きます。
歪度を計算します。
# 歪度を計算 numer <- 2 * (beta - alpha) * sqrt(alpha + beta + 1) denom <- (alpha + beta + 2) * sqrt(alpha * beta) skewness <- numer / denom skewness
## [1] -0.5962848
ベータ分布の歪度は、次の式で計算できます。
ここで、$\phi$の平均$\mu = \mathbb{E}[\phi]$、標準偏差$\sigma = \sqrt{\mathbb{E}[(\phi - \mu)^2]}$です。
尖度を計算します。
# 尖度を計算 numer <- (6 * (alpha - beta)^2 * (alpha + beta + 1) - alpha * beta * (alpha + beta + 2)) denom <- alpha * beta * (alpha + beta + 2) * (alpha + beta + 3) kurtosis <- numer / denom kurtosis
## [1] 0.38
ベータ分布の尖度は、次の式で計算できます。
この記事では、ベータ分布の計算を確認しました。次は、グラフを作成します。
参考文献
- 岩田具治『トピックモデル』(機械学習プロフェッショナルシリーズ)講談社,2015年.
おわりに
途中まで書いて放置してたのを続きも含めて書き上げられました。このまま他の分布も進めたい。
【次の内容】