からっぽのしょこ

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

【R】ガンマ関数の作図

はじめに

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

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

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

ガンマ関数の作図

 ガンマ関数(Gamma Function)の計算を確認して、グラフを作成します。ガンマ関数については「ガンマ関数の性質の導出 - からっぽのしょこ」を参照してください。

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

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


定義式の確認

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

 ガンマ関数は、次の式で定義されます。

$$ \Gamma(x) = \int_0^{\infty} u^{x-1} e^{-u} du $$

 ここで、$e$はネイピア数です。

ガンマ関数の計算

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

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

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

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


 対数ガンマ関数lgamma()を使って計算します。

# 対数ガンマ関数による計算
log_y <- lgamma(x)
y <- exp(log_y)
y
## [1] 6

 計算結果の指数をとるとガンマ関数の計算結果が得られます。

 ガンマ関数の計算は非常に大きな値になるため、引数(変数)$x$によっては発散してしまいます。

# ガンマ関数を計算:(発散)
gamma(171); gamma(172)
## [1] 7.257416e+306
## [1] Inf


 途中計算などでは、対数ガンマ関数を使うことで計算できます。

# 対数ガンマ関数による計算
lgamma(172)
## [1] 711.7147


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

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


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

グラフの作成

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

非負の値の場合

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

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

# ガンマ関数の計算
gamma_df <- tidyr::tibble(
  x = x_vals, 
  y = gamma(x_vals)
)
head(gamma_df)
## # A tibble: 6 x 2
##       x     y
##   <dbl> <dbl>
## 1  0.01  99.4
## 2  0.02  49.4
## 3  0.03  32.8
## 4  0.04  24.5
## 5  0.05  19.5
## 6  0.06  16.1

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

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

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

f:id:anemptyarchive:20220301133701p:plain
ガンマ関数のグラフ

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

負の値を含む場合

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

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

# ガンマ関数の計算
gamma_df <- tidyr::tibble(
  x = x_vals, 
  y = gamma(x_vals)
)
head(gamma_df)
## # A tibble: 6 x 2
##       x      y
##   <dbl>  <dbl>
## 1 -5    NaN   
## 2 -5.00 -16.7 
## 3 -5.00  -8.35
## 4 -5.00  -5.57
## 5 -5.00  -4.18
## 6 -5.00  -3.35

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

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

# ガンマ関数を作図
ggplot(data = gamma_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 = "Gamma Function", 
       y = expression(Gamma(x))) # ラベル

f:id:anemptyarchive:20220302231440p:plain
ガンマ関数のグラフ

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

参考文献

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

おわりに

 またまた推しメンの卒業発表があって意気消沈、とても立派で素敵なことなんだけどね。私も色々卒業したいなぁ。気を紛らわせるために無心でこの記事を書きました。

【次の内容】

www.anarchive-beta.com