からっぽのしょこ

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

1.2.1:二項分布【『トピックモデル』の勉強ノート】

はじめに

 機械学習プロフェッショナルシリーズの『トピックモデル』の勉強時に自分の理解の助けになったことや勉強会資料のまとめです。トピックモデルの各種アルゴリズムを「数式」と「プログラム」から理解することを目指します。

 この記事は、1.2.1項「ベルヌーイ分布」の内容です。二項分布の定義を説明して、平均と分散を導出します。最後にRで可視化します。

【前節の内容】

www.anarchive-beta.com

【他の節一覧】

www.anarchive-beta.com

【この節の内容】


1.2.1 二項分布

・定義

 表(当たり)の出る確率が$\phi$であるコイン(くじ)を$N$回試行するとき、表(当たり)の出る回数$x$の確率分布を二項分布という。

 $x$はコインを$N$回投げて表が出た回数なので、0(全て裏)から$N$(全て表)の値をとる。これを次のように書く。(ベルヌーイ分布は表(が1回)なら1、裏(表が0回)なら0と解釈できる。)

$$ x = \{0, 1, \cdots, N \} $$

 ベルヌーイ分布と同様に、表となる確率を$\phi$、裏となる確率を$1 - \phi$とすると二項分布は次の式となる。

$$ \mathrm{Binomial}(x | N, \phi) = \binom{N}{x} \phi^x (1 - \phi)^{N-x} $$

 ここで

$$ \binom{N}{x} = {}_N\mathrm{C}_x = \frac{N!}{(N - x)! x!} $$

は試行回数が$N$回のときに、$x$回表となる組合せの数を求めるための項である。

 例えば、表が出る確率が$\phi$のコインを3回投げた($N = 3$)とき、表が2回出る($x = 2$となる)確率は

$$ \begin{aligned} \mathrm{Binomial}(x = 2 | N = 3, \phi) &= \frac{3!}{(3 - 2)! 2!} \phi^2 (1 - \phi)^{3-2} \\ &= 3 \phi^2 (1 - \phi) \end{aligned} $$

になる。このとき、正規化項は3回中2回表となる組み合わせを表し、$\{表, 表, 裏\}$、$\{表, 裏, 表\}$、$\{裏, 表, 表\}$の3通りであることを求めている。

 また試行回数が1回($N = 1$)のとき、この式(分布)は

$$ \begin{aligned} \mathrm{Binomial}(x | 1, \phi) &= \frac{1!}{(1 - x)! x!} \phi^x (1 - \phi)^{1-x} \\ &= \frac{1!}{1! 0!} \phi^x (1 - \phi)^{1-x} \\ &= \phi^x (1 - \phi)^{1-x} = \mathrm{Bernoulli}(x | \phi) \end{aligned} $$

【途中式の途中式】

  • $N = 1$なので$x$は0か1である。また$0! = 1! = 1$であるため、$x$がどちらであっても$\frac{1!}{(1 - x)!x!} = 1$になる。


ベルヌーイ分布と等しくなることが分かる。

 次からは、この分布の平均と分散を求めていく。

・平均の導出

 確率変数が取り得る値$x$とその値となる確率$p(x)$とを掛けて、和をとった値が平均となる。

$$ \begin{aligned} \mathbb{E}[x] &= \sum_{x=0}^N x p(x) \\ &= \sum_{x=0}^N x \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} \\ &= 0 \frac{N!}{(N - 0)! 0!} \phi^0 (1 - \phi)^{N-0} + \sum_{x=1}^N x \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} \\ &= \sum_{x=1}^N x \frac{N * (N - 1)!}{(N - x)! x * (x - 1)!} \phi * \phi^{x-1} (1 - \phi)^{N-x} \\ &= N \phi \sum_{x=1}^N \frac{(N - 1)!}{(N - x)! (x - 1)!} \phi^{x-1} (1 - \phi)^{N-x} \\ &= N \phi * 1 \\ &= N \phi \end{aligned} $$

【途中式の途中式】

  1. 平均の定義式(1.5)より、式を立てる。
  2. $p(x) = \mathrm{Binomial}(x | N, \phi)$で置き換える。
  3. $x = 0$に関する項だけを取り出す。またこの項は0となるため消える。
  4. $N! = N (N - 1)!$、$\frac{1}{x!} = \frac{1}{x (x - 1)!}$、$\phi^x = \phi \phi^{x-1}$に分割する。
  5. $N$と$\phi$は定数なので$\sum_x$の外に出す。
  6. $\sum_{x=1}^N$の項について考える。

 $N - x = N - 1 - (x - 1)$で置き換える。

$$ \begin{aligned} \sum_{x=1}^N \frac{(N - 1)!}{(N - x)! (x - 1)!} \phi^{x-1} (1 - \phi)^{N-x} &= \sum_{x=1}^{N} \frac{ (N - 1)! }{ \{(N - 1) - (x - 1)\}! (x - 1)! } \phi^{x-1} (1 - \phi)^{(N-1)-(x-1)} \\ &= \sum_{x-1=0}^{N-1} \frac{ (N - 1)! }{ \{(N - 1) - (x - 1)\}! (x - 1)! } \phi^{x-1} (1 - \phi)^{(N-1)-(x-1)} \end{aligned} $$

 更にこの式を$N' = N - 1,\ x' = x - 1$で置き換えると

$$ \sum_{x'=0}^{N'} \frac{N'!}{(N' - x')! x'!} \phi^{x'} (1 - \phi)^{N'-x'} = \sum_{x'=0}^{N'} \mathrm{Binomial}(x' | N', \phi) $$

試行回数が$N'$の二項分布の表の回数$x'$について、0から$N'$まで(全事象)の確率の和となるため1になることが分かる。



・分散の導出

 1.1.7項より、「$x$の2乗の平均」と「$x$の平均の2乗」との差が分散となる。そこでまず$x$の2乗の平均を求める。

$$ \begin{aligned} \mathbb{E}[x^2] &= \sum_{x=0}^N x^2 p(x) \\ &= \sum_{x=0}^N x^2 \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} \\ &= \sum_{x=0}^N \{x (x - 1) + x\} \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} \\ &= \sum_{x=0}^N x (x - 1) \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} + \sum_{x=0}^N x \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} \\ &= \sum_{x=2}^N x (x - 1) \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} + \mathbb{E}[x] \\ &= \sum_{x=2}^N x(x - 1) \frac{ N * (N - 1) * (N - 2)! }{ (N - x)! x * (x - 1) * (x - 2)! } \phi^2 * \phi^{x-2} (1 - \phi)^{N-x} + N \phi \\ &= N (N - 1) \phi^2 \sum_{x=2}^N \frac{(N - 2)!}{(N - x)! (x - 2)!} \phi^{x-2} (1 - \phi)^{N-x} + N \phi \\ &= N (N - 1) \phi^2 \sum_{x=0}^{N-2} p(x - 2) + N \phi \\ &= N (N - 1) \phi^2 * 1 + N \phi \\ &= N (N - 1) \phi^2 + N \phi \end{aligned} $$

【途中式の途中式】

  1. 平均の定義式(1.5)より式を立てる。
  2. $p(x) = \mathrm{Binomial}(x | N, \phi)$で置き換える。
  3. $x^2 = x (x - 1) + x$に分割する。
  4. $\sum (A + B) = \sum A + \sum B$であることから、式を分割する。
  5. 式を整理する。
    • 前の項は、$x = 0, 1$のとき$x (x - 1)$が0となるため、$\sum_x$の計算に影響しないため除く。
    • 後の項は、$\mathbb{E}[x] = \sum_{x=0}^N x \frac{N!}{(N - x)! x!} \phi^x (1 - \phi)^{N-x} = N \phi$である。
  6. $N! = N (N - 1) (N - 2)!$、$\frac{1}{x!} = \frac{1}{x (x - 1) (x - 2)!}$、$\phi^x = \phi^2 \phi^{x-2}$に、項を分割する。
  7. $N (N - 1)$と$\phi2$は定数なので、$\sum_x$の外に出す。
  8. $\sum_{x=2}^N$の項について考える。

 $N - x = (N - 2) - (x - 2)$に置き換える

$$ \begin{aligned} \sum_{x=2}^N \frac{(N - 2)!}{(N - x)! (x - 2)!} \phi^{x-2} (1 - \phi)^{N-x} &= \sum_{x=2}^N \frac{ (N - 2)! }{ \{(N - 2) - (x - 2)\}! (x - 2)! } \phi^{x-2} (1 - \phi)^{(N-2)-(x-2)} \\ &= \sum_{x-2=0}^{N-2} \frac{ (N - 2)! }{ \{(N - 2) - (x - 2)\}! (x - 2)! } \phi^{x-2} (1 - \phi)^{(N-2)-(x-2)} \end{aligned} $$

 更にこの式を$N' = N - 2,\ x' = x - 2$で置き換えると

$$ \sum_{x'=0}^{N'} \frac{N'!}{(N'-x')! x'!} \phi^{x'} (1 - \phi)^{N'-x'} = \sum_{x'=0}^{N'} \mathrm{Binomial}(x' | N', \phi) $$

試行回数が$N'$の二項分布の表の回数$x'$について0から$N'$まで(全事象)の和となるため1になることが分かる。



 「$x$の2乗の平均」と「$x$の平均の2乗」との差を求める。

$$ \begin{aligned} \mathrm{Var}[x] &= \mathbb{E}[x^2] - (\mathbb{E}[x])^2 \\ &= N (N - 1) \phi^2 + N \phi - (N \phi)^2 \\ &= N^2 \phi^2 - N \phi^2 + N \phi - N^2 \phi^2 \\ &= N \phi (1 - \phi) \end{aligned} $$

 $N = 1$(試行回数が1)のとき、二項分布の平均は$N \phi = \phi$、分散は$N \phi (1 - \phi) = \phi (1 - \phi)$なので、ベルヌーイ分布の平均と分散とそれぞれ等しくなることも確認できる。

・可視化

 表になる確率が0.2である歪んだコインを10回投げたときの表が出る回数の分布を確認します。

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

# 試行回数を指定
N <- 10

# 表となる確率(コインの歪み具合)を指定
phi <- 0.2

# 作図
tibble(
  x = 0:N, # 表の回数
  prob = dbinom(x = x, size = N, prob = phi) # 二項分布に従う確率
  ) %>% 
  ggplot(mapping = aes(x = x, y = prob)) + # データ
    geom_bar(stat = "identity", position = "dodge", fill = "#00A968") + # 棒グラフ
    labs(title = "Binomial Distribution", # タイトル
         subtitle = paste0("N=", N, ", phi=", phi)) # サブタイトル

f:id:anemptyarchive:20200617125357p:plain
二項分布


・パラメータ$\phi$の違いによる分布の変化

・コード(クリックで展開)

# 試行回数を指定
N <- 100

# 表となる確率を指定
phi <- c(0.1, 0.33, 0.5, 0.8, 0.9)

# 作図用のデータフレームを作成
res_df <- tibble()
for(i in seq_along(phi)) {
  
  # 計算結果のデータフレームを作成
  tmp_df <- tibble(
    x = 0:N, # 表の回数
    prob = dbinom(x = x, size = N, prob = phi[i]), # 二項分布に従う確率
    phi = as.factor(phi[i]) # 作図用のラベル
)
  
  # データフレームを結合
  res_df <- rbind(res_df, tmp_df)
}

# 作図
ggplot(data = res_df, mapping = aes(x = x, y = prob, fill = phi, color = phi)) + # データ
  geom_bar(stat = "identity", position = "dodge") + # 棒グラフ
  scale_fill_manual(values = c("#FFC0CB", "#FF0000", "#FFFF00", "#EE82EE", "#7FFF00")) + # 塗りつぶし色(不必要)
  scale_color_manual(values = c("#FFC0CB", "#FF0000", "#FFFF00", "#EE82EE", "#7FFF00")) + # 枠の色(不必要)
  theme_dark() + # 背景色(不必要)
  labs(title = "Binomial Distribution") # タイトル

 (色の指定はただの趣味です。指定するパラメータの個数と色の数を合わせる必要があるためそもそも使わない方がいいです。)

f:id:anemptyarchive:20200617125436p:plain
二項分布のパラメータと形状の関係


・gif画像を作成用コード

 パラメータ$\phi$の変化による分布の変化をgif画像で確認します。

・コード(クリックで展開)

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

# 試行回数を指定
N <- 100

# 表の確率
phi <- seq(0.01, 0.99, by = 0.01)

# 作図用のデータフレームを作成
res_df <- tibble()
for(i in seq_along(phi)) {
  
  # 計算結果のデータフレームを作成
  tmp_df <- tibble(
    n = 1:N, # 表の回数
    prob = dbinom(x = n, size = N, prob = phi[i]), # 確率
    phi = as.factor(phi[i]) # 作図用のラベル
  )
  
  # データフレームを結合
  res_df <- rbind(res_df, tmp_df)
}

# 作図
graph_binom <- ggplot(data = res_df, mapping = aes(x = n, y = prob)) + # データ
  geom_bar(stat = "identity", position = "dodge", fill = "#00A968", color = "#00A968") + # 棒グラフ
  transition_manual(phi) + # フレーム
  labs(title = "Binomial Distribution", 
       subtitle = "phi={current_frame}") # ラベル

# gif画像を作成
animate(graph_binom, nframes = length(phi), fps = 10)

 gganimate::transition_manual()に時系列となる列を指定します。図を構成できたらgganimate::animate()で出力します。

f:id:anemptyarchive:20200617130105g:plain
パラメータ$\phi$と分布の形状の関係


 試行回数$N$の変化による分布の変化をgif画像で確認します。

・コード(クリックで展開)

# 試行回数を指定
N <- 200

# 表となる確率を指定
phi <- 0.5

# 作図用のデータフレームを作成
res_df <- tibble()
for(i in 1:N) {
  
  # 計算結果のデータフレームを作成
  tmp_df <- tibble(
    x = 1:i, # 表の回数
    prob = dbinom(x = x, size = i, prob = phi), # 確率
    N = as.factor(i) # 作図用のラベル
  )
  
  # データフレームを結合
  res_df <- rbind(res_df, tmp_df)
}

# 作図
graph_binom <- ggplot(data = res_df, mapping = aes(x = x, y = prob)) + # データ
  geom_bar(stat = "identity", position = "dodge", fill = "#00A968", color = "#00A968") + # 棒グラフ
  transition_manual(N) + # フレーム
  labs(title = "Binomial Distribution", 
       subtitle = "N={current_frame}") # ラベル

# gif画像を作成
animate(graph_binom, nframes = N, fps = 20)

f:id:anemptyarchive:20200617125914g:plain
試行回数と分布の形状の関係


 ベルヌーイ分布と二項分布は、変数が2値(コインに例えられる)をとる確率分布であった。次項では$\{1, 2, \cdots, V\}$の値(サイコロに例えられる)をとる確率分布を説明する。

参考書籍

  • 岩田具治(2015)『トピックモデル』(機械学習プロフェッショナルシリーズ)講談社
  • 須山敦志(2017)『ベイズ推論による機械学習入門』(機械学習スタートアップシリーズ)講談社


おわりに

2019/08/17:加筆修正しました。

 色々間違っていました。

2020/06/17:加筆修正しました。

【次節の内容】

www.anarchive-beta.com