からっぽのしょこ

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

【R】ディガンマ関数の作図

はじめに

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

 ディガンマ関数のグラフをR言語で作成します。

【前の内容】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

ディガンマ関数の作図

 ディガンマ関数(Digamma Function)の計算を確認して、グラフを作成します。

 利用するパッケージを読み込みます。

# 利用するパッケージ
library(tidyverse)


ディガンマ関数の定義

 まずは、ディガンマ関数の定義を確認します。

 ディガンマ関数は、ガンマ関数の対数の微分で定義されます。ガンマ関数については「ガンマ関数の性質の導出 - からっぽのしょこ」を参照してください。

$$ \psi(x) = \frac{d}{d x} \log \Gamma(x) = \frac{1}{\Gamma(x)} \frac{d \Gamma(x)}{d x} $$

 ここで、$\Gamma(x)$はガンマ関数です。対数関数の微分は$\frac{d \log x}{d x} = \frac{1}{x}$です。

ディガンマ関数の計算

 続いて、ディガンマ関数の計算方法を確認します。

 ディガンマ関数digamma()を使って計算します。

# 変数の値を指定
x <- 4

# ガンマ関数の計算
y <- digamma(x)
y
## [1] 1.256118


 $x$が0または負の整数の場合は計算できません。

# ディガンマ関数を計算:(計算できない)
digamma(0); digamma(-3)
## [1] NaN
## [1] NaN


 ディガンマ関数の計算を確認できました。次は、ディガンマ関数を可視化します。

グラフの作成

 ggplot2パッケージを利用して、ディガンマ関数のグラフを作成します。

非負の値の場合

 まずは、0より大きい実数$x$を範囲として、ディガンマ関数を計算します。

# xの値を指定:(x > 0)
x_vals <- seq(from = 0.01, to = 5, by = 0.01)

# ディガンマ関数の計算
digamma_df <- tidyr::tibble(
  x = x_vals, 
  y = digamma(x_vals)
)
head(digamma_df)
## # A tibble: 6 x 2
##       x      y
##   <dbl>  <dbl>
## 1  0.01 -101. 
## 2  0.02  -50.5
## 3  0.03  -33.9
## 4  0.04  -25.5
## 5  0.05  -20.5
## 6  0.06  -17.1

 x軸の値を作成してx_valsとします。
 作成したx_valsを用いて、digamma()でディガンマ関数の計算をします。
 作図用に、x_valsと各要素に対応する計算結果をデータフレームに格納します。

 ガンマ関数のグラフを作成します。

# ディガンマ関数を作図
ggplot(data = digamma_df, mapping = aes(x = x, y = y)) + # データ
  geom_line(color = "orange") + # 折れ線グラフ
  labs(title = "Digamma Function", 
       y = expression(psi(x))) # ラベル

ディガンマ関数のグラフ

 $x = 0$の垂線に漸近しているのが分かります。

負の値を含む場合

 続いて、負の実数も含めて、ディガンマ関数を計算します。

# xの値を指定:(0と負の整数は計算)
x_vals <- seq(from = -5, to = 5, by = 0.002)

# ディガンマ関数の計算
digamma_df <- tidyr::tibble(
  x = x_vals, 
  y = digamma(x_vals)
)
head(digamma_df)
## # A tibble: 6 x 2
##       x      y
##   <dbl>  <dbl>
## 1 -5     NaN  
## 2 -5.00 -498. 
## 3 -5.00 -248. 
## 4 -4.99 -165. 
## 5 -4.99 -123. 
## 6 -4.99  -98.3

 0と負の整数のとき、計算結果がNaNになります。

 ディガンマ関数のグラフを作成します。

# ディガンマ関数を作図
ggplot(data = digamma_df, mapping = aes(x = x, y = y)) + # データ
  geom_line(color = "orange") + # 折れ線グラフ
  scale_x_continuous(breaks = seq(from = floor(min(x_vals)), to = floor(max(x_vals)))) + # x軸目盛
  ylim(c(-10, 10)) + # y軸の表示範囲
  labs(title = "Digamma Function", 
       y = expression(psi(x))) # ラベル

ディガンマ関数のグラフ

 x軸の値が負の整数と0の点において、不連続なグラフになっているのが分かります。

参考文献

  • 岩田具治『トピックモデル』(機械学習プロフェッショナルシリーズ)講談社,2015年.

おわりに

 複素平面なる概念の理解が要るらしい。

【次の内容】

www.anarchive-beta.com