からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

【R】1次元ガウス分布の計算

はじめに

 機械学習で登場する確率分布について色々な角度から理解したいシリーズです。

 この記事では、R言語で1次元ガウス分布(一変量正規分布)に関する計算をします。

【前の内容】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

1次元ガウス分布の計算

 1次元ガウス分布(Gaussian Distribution)の確率密度と統計量を計算します。ガウス分布については「1次元ガウス分布の定義式の確認 - からっぽのしょこ」を参照してください。

確率密度の計算

 ガウス分布に従う確率密度を計算する方法をいくつか確認します。

標準偏差パラメータを使用

 まずは、標準偏差パラメータを用いてガウス分布を計算します。

パラメータの設定

 ガウス分布のパラメータ$\mu, \sigma$と確率変数の実現値$x$を設定します。

# 平均パラメータを指定
mu <- 2

# 標準偏差パラメータを指定
sigma <- 0.5

# 確率変数の値を指定
x <- 1.5

 平均パラメータ(実数)$\mu$と標準偏差パラメータ(正の実数)$\sigma$、確率変数の値(実数)$x$を指定します。設定した値に従う確率密度を計算します。

スクラッチで計算

 定義式から計算します。

# 定義式により確率密度を計算
C    <- 1 / sqrt(2 * pi * sigma^2)
dens <- C * exp(-0.5 * (x - mu)^2 / sigma^2)
dens
## [1] 0.4839414

 ガウス分布は、次の式で定義されます。

$$ \begin{aligned} C_{\mathcal{N}} &= \frac{1}{\sqrt{2 \pi \sigma^2}} \\ \mathcal{N}(x | \mu, \sigma^2) &= C_{\mathcal{N}} \exp \left\{ - \frac{(x - \mu)^2}{2 \sigma^2} \right\} \end{aligned} $$

 ここで、$C_{\mathcal{N}}$はガウス分布の正規化係数、$\pi$は円周率です。
 円周率はpiで利用できます。

 対数をとった定義式から計算します。

# 対数をとった定義式により確率密度を計算
log_C    <- -0.5 * log(2 * pi) - log(sigma)
log_dens <- log_C - 0.5 * (x - mu)^2 / sigma^2
dens     <- exp(log_dens)
dens; log_dens
## [1] 0.4839414
## [1] -0.7257914

 対数をとった定義式を計算します。

$$ \begin{aligned} \log C_{\mathcal{N}} &= - \frac{\log (2 \pi)}{2} - \log \sigma \\ \log \mathcal{N}(x | \mu, \sigma^2) &= \log C_{\mathcal{N}} - \frac{(x - \mu)^2}{2 \sigma^2} \end{aligned} $$

 計算結果の指数をとると確率密度が得られます。

$$ \mathcal{N}(x | \mu, \sigma^2) = \exp \Bigr( \log \mathcal{N}(x | \mu, \sigma^2) \Bigr) $$

 指数と対数の性質より$\exp(\log x) = x$です。

 次は、関数を使って確率密度を計算します。

ガウス分布の関数による計算

 ガウス分布の確率密度関数dnorm()で計算します。

# ガウス分布の関数により確率密度を計算
dens <- dnorm(x = x, mean = mu, sd = sigma)
dens
## [1] 0.4839414

 確率変数の引数xx、平均の引数meanmu、標準偏差の引数sdsigmaを指定します。

 log = TRUEを指定すると対数をとった確率密度を返します。

# ガウス分布の対数をとった関数により確率密度を計算
log_dens <- dnorm(x = x, mean = mu, sd = sigma, log = TRUE)
dens     <- exp(log_dens)
dens; log_dens
## [1] 0.4839414
## [1] -0.7257914

 計算結果の指数をとると確率密度が得られます。

 標準正規分布を使って計算することもできます。

# 標準正規分布の関数により確率密度を計算
y    <- (x - mu) / sigma # 標準化
dens <- dnorm(x = y, mean = 0, sd = 1) / sigma
dens
## [1] 0.4839414

 $x$を$\mu, \lambda$で標準化して$y$とします。平均0・標準偏差1(分散1)のときの$y$の確率密度(分布)$\mathcal{N}(y | 0, 1)$を$\sigma$で割ると、平均$\mu$・標準偏差$\sigma$(分散$\sigma^2$)のときの$x$の確率密度(分布)$\mathcal{N}(x | \mu, \sigma)$が得られます。

精度パラメータを使用

 続いて、精度パラメータを用いてガウス分布を計算します。

パラメータの設定

 ガウス分布のパラメータ$\mu, \lambda$と確率変数の実現値$x$を設定します。

# 平均パラメータを指定
mu <- 2

# 精度パラメータを指定
lambda <- 4

# 確率変数の値を指定
x <- 1.5

 標準偏差パラメータ$\sigma$の代わりに、精度パラメータ(正の実数)$\lambda$を指定します。

 あるいは、$\sigma$を指定して$\lambda$を計算します。

# 精度パラメータを計算
lambda <- 1 / sigma^2
lambda
## [1] 4

 標準偏差パラメータ$\sigma$と精度パラメータ$\lambda$は、$\lambda = \frac{1}{\sigma^2}$、$\sigma = \frac{1}{\sqrt{\lambda}}$の関係です。

スクラッチで計算

 定義式から計算します。

# 定義式により確率密度を計算
C    <- sqrt(lambda / 2 / pi)
dens <- C * exp(-0.5 * lambda * (x - mu)^2)
dens
## [1] 0.4839414

 ガウス分布は、次の式で定義されます。

$$ \begin{aligned} C_{\mathcal{N}} &= \Bigl( \frac{\lambda}{2 \pi} \Bigr)^{\frac{1}{2}} \\ \mathcal{N}(x | \mu, \lambda^{-1}) &= C_{\mathcal{N}} \exp \left\{ - \frac{\lambda (x - \mu)^2}{2} \right\} \end{aligned} $$

 平方根は$\sqrt{x} = x^{\frac{1}{2}}$です。

 対数をとった定義式から計算します。

# 対数をとった定義式により確率密度を計算
log_C    <- -0.5 * (log(2 * pi) - log(lambda))
log_dens <- log_C - 0.5 * lambda * (x - mu)^2
dens     <- exp(log_dens)
dens; log_dens
## [1] 0.4839414
## [1] -0.7257914

 対数をとった定義式を計算します。

$$ \begin{aligned} \log C_{\mathcal{N}} &= - \frac{1}{2} \Bigl\{ \log (2 \pi) - \log \lambda \Bigr\} \\ \log \mathcal{N}(x | \mu, \lambda^{-1}) &= \log C_{\mathcal{N}} - \frac{\lambda (x - \mu)^2}{2} \end{aligned} $$

 計算結果の指数をとると確率密度が得られます。

ガウス分布の関数による計算

 ガウス分布の確率密度関数dnorm()で計算します。

# ガウス分布の関数により確率密度を計算
dens <- dnorm(x = x, mean = mu, sd = 1/sqrt(lambda))
dens

# ガウス分布の対数をとった関数により確率密度を計算
log_dens <- dnorm(x = x, mean = mu, sd = 1/sqrt(lambda), log = TRUE)
dens     <- exp(log_dens)
dens; log_dens
## [1] 0.4839414
## [1] 0.4839414
## [1] -0.7257914

 標準偏差の引数sdlambdaの平方根の逆数を指定します。

 標準正規分布を使って計算することもできます。

# 標準正規分布の関数により確率密度を計算
y    <- (x - mu) * sqrt(lambda) # 標準化
dens <- dnorm(x = y, mean = 0, sd = 1) * sqrt(lambda)
dens
## [1] 0.4839414

 $x$を$\mu, \sigma$で標準化して$y$とします。平均0・精度1(分散1)のときの$y$の確率密度(分布)$\mathcal{N}(y | 0, 1)$に$\lambda$の平方根を掛けると、平均$\mu$・精度$\lambda$(分散$\lambda^{-1}$)のときの$x$の確率密度(分布)$\mathcal{N}(x | \mu, \lambda^{-1})$が得られます。

統計量の計算

 次は、ガウス分布の期待値・分散・精度を計算します。詳しくは「統計量の導出」を参照してください。

 標準偏差パラメータを使って、分散パラメータを計算します。

# 標準偏差から分散を計算
sigma2 <- sigma^2
sigma2
## [1] 0.25

 分散は、標準偏差の2乗です。

$$ \mathbb{V}[x] = \sigma^2 $$

 分散パラメータを使って、精度パラメータを計算します。

# 分散から精度を計算
lambda <- 1 / sigma2
lambda
## [1] 4

 精度は、分散の逆数です。

$$ \lambda = \frac{1}{\sigma^2} $$

 精度パラメータを使って、標準偏差パラメータを計算します。

# 精度から標準偏差を計算
sigma <- 1 / sqrt(lambda)
sigma
## [1] 0.5

 標準偏差は、精度の平方根の逆数で計算できます。

$$ \sigma = \frac{1}{\sqrt{\lambda}} $$

 元の値になるのを確認できました。

 この記事では、ガウス分布の計算を確認しました。次は、グラフを作成します。

参考文献

  • 須山敦志『ベイズ推論による機械学習入門』(機械学習スタートアップシリーズ)杉山将監修,講談社,2017年.

おわりに

 加筆修正の際に「1次元ガウスの作図」から記事を分割しました。

【次の内容】

www.anarchive-beta.com