ラベル ベイズ の投稿を表示しています。 すべての投稿を表示
ラベル ベイズ の投稿を表示しています。 すべての投稿を表示

2020年9月9日水曜日

ベルヌーイ施行における最尤推定と事後分布

複数回のベルヌーイ施行においてパラメータ $\theta = p$ を最尤推定および事後分布(からの点推定)で推定する際に
  • どの程度の差異が発生するのか
  • どのように差異が収斂していくのか
をシミュレーションで検証する。

この記事は以前に記載した ベルヌーイ分布と事後分布 の 「1.1.3 無情報事前分布における MAP と MLE の一致」 で簡潔に述べた内容を含み、より広い条件で検証するものである。


1. 導出された結果(再掲)


以前の記事で導出した結果のみを下記に記載する。
※詳細な定義および導出の過程は ベルヌーイ分布と事後分布 を参照

  • $p(\theta | x^{n})$: 事後分布
  • $x_{j}$: サンプルデータ
  • $n$: サンプル数
  • $a, b$: 事前分布 $Beta(a,b)$ のパラメータ

\begin{eqnarray} p(\theta | x^{n}) &=& Beta(a + \sum_{j=1}^{n} x_{j}, n + b - \sum_{j=1}^{n} x_{j}) \\ \hat{\theta}_{MLE} &=& \frac{1}{n} \sum_{j=1}^{n} x_{j} \\ \hat{\theta}_{MAP} &=& \frac{a + \sum x_{j} - 1}{n + a + b - 2} \\ \hat{\theta}_{EAP} &=& \frac{ a + \sum x_{j} }{ n + a + b } \end{eqnarray}

2. 事前分布


上記ではベルヌーイ施行における事前分布としてベータ分布を仮定しており、以下ではパラメータ $a, b$ を 2 パターン設定して検証を行う。
  1. (a, b) = (1, 1)
  2. (a, b) = (3, 6)
上記 1. は無情報事前分布であり下記の $Beta(1,1)$ に示すように定義域が $[0, 1]$ の一様分布となる。
library(tidyverse)

# Beta 分布のパラメータ
lst.beta <- list(
  a = 3,
  b = 6
)

tibble(
  p = seq(0, 1, 0.01),
  d_1_1 = dbeta(0, 1, 1),                  # Beta(1,1)
  d_a_b = dbeta(p, lst.beta$a, lst.beta$b) # Beta(a,b)
) %>%

  # to wide-form
  tidyr::pivot_longer(cols = -p, names_to = "param", values_to = "density") %>%

  # 可視化
  ggplot(aes(p, density)) +
    geom_line() +
    labs(y = NULL) +
    facet_grid(
      . ~ param,
      labeller = labeller(
        param = as_labeller(c(
          "d_1_1" = "B(1,1)",
          "d_a_b" = stringr::str_c("Beta(", lst.beta$a, ",", lst.beta$b, ")")
        ))
      )
    )



2. データの生成


真のパラメータ $p = 0.3$ を指定して 1,000 個の TRUE/FALSE からなる乱数 $x$ を生成する。
set.seed(1025)

n <- 1000
p <- 0.3

# データ生成
x <- rbernoulli(n, p)

# 先頭 10 件の確認
x[1:10]
# FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE

# x の平均値
# 真のパラメータ p=0.3 にかなり近い
mean(x)
# 0.29

上記 $x$ を用いて各累積施行ごとにパラメータ $p$ を推定していく。
※コメント内の番号 (1)〜(4) は 「1. 導出された結果(再掲)」 における数式の番号に紐づく
df.estimations <- tibble(
  # 延べ試行回数
  n = 1:length(x),
  
  # 成功: 1
  # 失敗: 0
  x = as.integer(x),

  # 延べ成功回数
  cumsum_x = cumsum(x),

  # 最尤推定による点推定値 - (2)
  MLE = cumsum_x / n,

  # MAP - (3)
  MAP_1_1 = (1 + cumsum_x - 1) / (n + 1 + 1 -2),                            # 事前分布: Beta(1,1)
  MAP_a_b = (lst.beta$a + cumsum_x - 1) / (n + lst.beta$a + lst.beta$b -2), # 事前分布: Beta(3,6)

  # EAP - (4)
  EAP_1_1 = (1 + cumsum_x) / (1 + 1 + n),                                   # 事前分布: Beta(1,1)
  EAP_a_b = (lst.beta$a + cumsum_x) / (lst.beta$a + lst.beta$b + n),        # 事前分布: Beta(3,6)

  # 事後分布の算出 - (1)
  post_dists = purrr::map2(n, cumsum_x, function(n, cumsum_x, a, b) {
    tibble::tibble(
      p = seq(0, 1, 0.01),
      post_d_1_1 = dbeta(p, 1 + cumsum_x, n + 1 - cumsum_x),                # 事前分布: Beta(1,1)
      post_d_a_b = dbeta(p, a + cumsum_x, n + b - cumsum_x)                 # 事前分布: Beta(3,6)
    )
  }, a = lst.beta$a, b = lst.beta$b)
)

df.estimations
      n             x       cumsum_x MLE MAP_1_1 MAP_a_b EAP_1_1 EAP_a_b post_dists
1 0 0 0 0 0.25 0.333 0.3 <tibble [101 × 3]>
2 0 0 0 0 0.222 0.25 0.273 <tibble [101 × 3]>
3 0 0 0 0 0.2 0.2 0.25 <tibble [101 × 3]>
4 0 0 0 0 0.182 0.167 0.231 <tibble [101 × 3]>
5 0 0 0 0 0.167 0.143 0.214 <tibble [101 × 3]>


上記 post_dists 項目には各行(累積施行)ごとに事後分布のデータが tibble 形式で格納されており、項目を指定しないと確認する事はできない。
下記は 1 回目の施行によりデータを 1 つ獲得した後の事後分布を 5 行だけ表示したものであり、post_d_xxx は確率密度を表す。

df.estimations[1,]$post_dists[[1]]
      p       post_d_1_1 post_d_a_b
0 2 0
0.01 1.98 0.0237
0.02 1.96 0.0893
0.03 1.94 0.189
0.04 1.92 0.316


3. 事後分布の確認


各施行ごとの事後分布を確認していく。

3.1 少ない試行回数での挙動


試行回数が少ない時の挙動を確認する。主に 1〜10 回をメインに観察する。
df.estimations%>%

  # 試行回数が特定の時点のみを対象
  dplyr::filter(n %in% c(1, 2, 3, 4, 5, 10, 25, 50, 100)) %>%

  # 事後分布の抽出
  tidyr::unnest(post_dists) %>%
  dplyr::select(n, MLE, p, post_d_1_1, post_d_a_b) %>%

  # => long-form
  tidyr::pivot_longer(cols = c(post_d_1_1, post_d_a_b), names_to = "type", values_to = "density") %>%

  # 可視化
  ggplot(aes(p, density)) +
    geom_line(aes(colour = type), alpha = 1, show.legend = F) +
    geom_vline(aes(xintercept = MLE), size = 1.0, linetype = "solid", colour = "gray") +
    labs(
      x = NULL,
      y = NULL
    ) +
    facet_grid(
      n ~ type,
      scale = "free_y",
      labeller = labeller(
        type = as_labeller(c(
          "post_d_1_1" = "Beta(1,1)",
          "post_d_a_b" = stringr::str_c("Beta(", lst.beta$a, ",", lst.beta$b, ")")
        ))
      )
    )

左列には $Beta(1,1)$ を事前分布(無情報事前分布)とする事後分布が、右列には $Beta(3,6)$ を事前分布とする事後分布が表示されている。
右側の番号は試行回数を表しており、下に進むほど試行回数が大きくなる。
各セルにおける横軸上の三角は MLE を表しており、各行ごとに左右の列で同じ位置に表示されている事に注意。


上記より把握できる事を下記にまとめる。
  • 試行回数が少ない場合に MLE はデータに過度に反応し、試行回数 1〜5 では p = 0 という極端な値を提示してしまっている
  • 左列である Beta(1,1) (無情報事前分布)側におけるピークの位置(MAP) と MLE は一致している(理論上完全に一致する)
  • 最初の 5 回で FALSE が続いている事を受けて Beta(1,1) 側はデータに過度に反応した事後分布を生成してしまっている
  • 最初の 5 回の FALSE で Beta(1,1) 側は試行回数が増える程に p = 0 の確信が高まっている様子が伺える
  • 試行回数が少ない時点では Beta(1,1) 側と Beta(3,6) 側では差異が大きい
  • 試行回数が大きくなるにつれ Beta(1,1) 側と Beta(3,6) 側の差異は縮まる傾向にある
  • Beta(1,1) 側および Beta(3,6) 側の両方で、試行回数が増えるにつれてピーク付近でのばらつきが減少している(横が狭くなる)事およびピークの位置が高くなっている事から段々と推定の確信が高まっている様子が伺える

3.2 事前分布による差異


$Beta(1,1)$ と $Beta(3,6)$ の異なる事前分布における挙動の差異を確認する。
df.estimations %>%

  dplyr::select(n, MAP_1_1, MAP_a_b, EAP_1_1, EAP_a_b) %>%

  # => long-form
  tidyr::pivot_longer(cols = c(MAP_1_1, MAP_a_b, EAP_1_1, EAP_a_b), names_pattern = "(MAP|EAP)_(.+_.+)", names_to = c("type", "param"), values_to = "prob") %>%

  # 可視化
  ggplot(aes(n, prob)) +
    geom_line(aes(color = param), alpha = 1/2) +
    geom_point(aes(colour = param), size = 0.75, alpha = 1/5) +

    # 真のパラメータ 0.3 を表示
    geom_hline(yintercept = 0.3, alpha = 1/3) +

    scale_y_continuous(limits = c(0, 0.5)) +
    scale_colour_hue(
      name = "Prior Dist",
      labels = c(
        "1_1" = "Beta(1,1)",
        "a_b" = stringr::str_c("Beta(", lst.beta$a, ",", lst.beta$b, ")")
      )
    ) +
    labs(
      x = "Trials",
      y = "Estimated Parameter"
    ) +
    facet_grid(type ~ .)

横軸に試行回数、縦軸にパラメータ p の推定値を表示する。
水平に伸びた直線はパラメータ p の真の値 0.3 を示している。
上下で推定値が異なる事に注意。


  • Beta(1,1) (無情報事前分布)を用いた推定値の方が上下の振れ幅が大きい傾向にある
  • MAP/EAP ともに試行回数が少ない範囲では事前分布の違いにより挙動が大きく異る
  • 試行回数が大きくなると事前分布による差異はほぼ見られくなる

3.3 点推定値による差異


MAP と EAP における挙動の差異を確認する。
df.estimations %>%

  dplyr::select(n, MAP_1_1, MAP_a_b, EAP_1_1, EAP_a_b) %>%

  # => long-form
  tidyr::pivot_longer(cols = c(MAP_1_1, MAP_a_b, EAP_1_1, EAP_a_b), names_pattern = "(MAP|EAP)_(.+_.+)", names_to = c("type", "param"), values_to = "prob") %>%

  # 可視化
  ggplot(aes(n, prob)) +
    geom_line(aes(color = type), alpha = 1/2) +
    geom_point(aes(colour = type), size = 0.75, alpha = 1/5) +

    # 真のパラメータ 0.3 を表示
    geom_hline(yintercept = 0.3, alpha = 1/3) +

    scale_y_continuous(limits = c(0, 0.5)) +
    labs(
      colour = NULL,
      x = "Trials",
      y = "Estimated Parameter"
    ) +
    facet_grid(
      param ~ .,
      labeller = labeller(
        param = as_labeller(c(
          "1_1" = "Beta(1,1)",
          "a_b" = stringr::str_c("Beta(", lst.beta$a, ",", lst.beta$b, ")")
        ))
      )
    )

横軸に試行回数、縦軸にパラメータ p の推定値を表示する。
水平に伸びた直線はパラメータ p の真の値 0.3 を示している。
上下で事前分布が異なる事に注意。


  • $Beta(1,1)$/$Beta(3,6)$ ともに試行回数が少ない範囲では推定量ごとの挙動に差異が見られる
  • 試行回数が大きくなると推定量による差異はほぼ見られくなる
  • EAP(赤色) > MAP(青色) の傾向がある(3.2.1 で後述)

3.2.1 EAP > MAP について


特定の状況においてほぼ EAP > MAP が成立する事を示す。
以下では EAP と MAP の差分を考える事で上記を検証していく。

\begin{eqnarray} \hat{\theta}_{EAP} - \hat{\theta}_{MAP} = \frac{ a + \sum x_{j} }{ n + a + b } - \frac{a + \sum x_{j} - 1}{n + a + b - 2}. \nonumber \end{eqnarray} 上記は分母が基本的に正となるので、計算を楽にするため以下では分子だけを考える。 \begin{eqnarray} 分子 &=& \{ (a + \sum x_{j})(n + a + b - 2) - (a + \sum x_{j} - 1)(n + a + b) \} \nonumber \\ &=& \Bigl[ \bigl\{ (a + \sum x_{j} - 1)(n + a + b - 2) + (n + a + b - 2) \bigr\} - (a + \sum x_{j} - 1)(n + a + b) \Bigr] \nonumber \\ &=& \{ (a + \sum x_{j} - 1)(- 2) + (n + a + b - 2) \} \nonumber \\ &=& \{ (b - a) + 2n (\frac{1}{2} - \frac{1}{n} \sum x_{j}) \} \nonumber \end{eqnarray} 上記より、パラメータ $p$ の不偏推定量である標本平均 $\frac{1}{n} \sum x_{j}$ が $\frac{1}{n} \sum x_{j} < \frac{1}{2}$ を満たせばほぼ $\hat{\theta}_{EAP}>\hat{\theta}_{MAP}$ が成立する。
今回はベルヌーイ分布の真のパラメータが $p = 0.3$ であり $\frac{1}{2}$ より小さい事からほぼ \begin{eqnarray} \therefore \hat{\theta}_{EAP} > \hat{\theta}_{MAP} \nonumber \end{eqnarray} が成立するものと考えられる(適当)。

3.3 試行回数による分布の変化


試行回数の増加に伴う分布の変化をマクロな視点で確認する。
df.estimations %>%

  dplyr::select(n, post_dists) %>%

  # 事後分布の抽出
  tidyr::unnest(post_dists) %>%

  # => long-form
  tidyr::pivot_longer(cols = c(post_d_1_1, post_d_a_b), names_to = "param", values_to = "density") %>%

  # 可視化
  ggplot(aes(n, p)) +
    geom_tile(aes(fill = density), show.legend = F) +
    scale_fill_gradient(low = "#132B43", high = "tomato") +
    labs(
      x = "Trials",
      y = "p"
    ) +
    facet_grid(
      param ~ .,
      labeller = labeller(
        param = as_labeller(c(
          "post_d_1_1" = "Beta(1,1)",
          "post_d_a_b" = stringr::str_c("Beta(", lst.beta$a, ",", lst.beta$b, ")")
        ))
      )
    ) +

    # 不要な余白を除去
    coord_cartesian(expand = F)

横軸に試行回数、縦軸にパラメータ p を表示し、各点における事後分布の確率密度を色で表現する。
黒に近いほど確率密度が低く、赤く明るいほど確率密度が高い事を示す。
上下で事前分布が異なる事に注意。


  • 全体を外観すると事前分布が異なる事による差異はほぼ見られない
  • 左端の方では明確な赤色が見られず全体としてぼやけた感じとなっている
  • 右側に進むにつれて赤と黒が明確に分離していく様子が見て取れる
  • 試行回数の増加と共にパラメータ推定の確信度が上がっていると考えられる
  • 試行回数が大きくなると分布に殆ど変化が見られなくなり、多少のデータ傾向の揺れに振り回されなくなってくる(左端の挙動と対称的)

上記から、ある程度の試行回数が存在しない限りパラメータ p の推定はあまり意味を持たない可能性があると思われる。


まとめ

  • サンプルが少ない場合に、MLE はデータに過度に反応し、データによってはかなり極端な値を提示してしまう
  • サンプルが少ない場合に、推定された事後分布はデータに過度に反応する可能性がある
  • サンプルが少ない場合に、推定された事後分布は事前分布の違いに大きく影響を受ける可能性がある
  • サンプルが少ない場合に、点推定量(MLE/MAP/EAP)による違いが現れる可能性がある
  • サンプルが増加するにつれ、推定される事後分布が多少のデータ傾向の揺れに影響を受けづらくなり安定する
  • サンプルが増加するにつれ、推定される事後分布は事前分布の違いにあまり影響を受けなくなる
  • サンプルが増加するにつれ、点推定量の違いによる差異はほぼ見られなくなる
  • ある程度のサンプルが存在しないとパラメータの推定はかなり厳しい

2020年5月26日火曜日

ベルヌーイ分布と事後分布

以前に読んだ 社会科学のためのベイズ統計モデリング がとても勉強になったので学んだ事をまとめておく。
内容は下記の通り。
  • 3 章 - ベルヌーイ分布に従う確率変数 X におけるパラメータ $\theta$ の事後分布と予測分布
  • 8 章 - 藤井七段(棋士)の勝率についての実データを用いた分析


以下では確率変数 X およびベルヌーイ分布のパラメータ $\theta$ が下記に従うものとして話を進める。
\begin{eqnarray} \label{bernoulli} X &\sim& Bernoulli(\theta) \\ \label{beta} \theta &\sim& Beta(a, b) \end{eqnarray}

1 理論の話


紙とペンで計算を行う事により各種概念を定義および導出していく。

1.1 事後分布


事後分布 $p(\theta | x^{n} )$ についてまずベイズの公式により下記が成立する。 \begin{eqnarray} p(\theta | x^{n}) &=& \frac{ p(x^{n} | \theta) \varphi(\theta) }{ \int p(x^{n} | \theta) \varphi(\theta) d\theta } \nonumber \end{eqnarray} ここで \[ Z_{n} \stackrel{\mathrm{def}}{=} \int_{0}^{1} p(x^{n} | \theta) \varphi(\theta) d\theta \] とおくと \begin{eqnarray} p(\theta | x^{n}) &=& \frac{ p(x^{n} | \theta) \varphi(\theta) }{ Z_{n} } \nonumber \\ &=& \frac{ 1 }{ Z_{n} } \prod_{j = 1}^{n} p(x_{j} | \theta) \cdot \varphi(\theta) ~~~ (\because (\ref{bernoulli}) および X は独立試行) \nonumber \end{eqnarray} となり、このとき ($\ref{bernoulli}$) ($\ref{beta}$) により \begin{eqnarray} p(x | \theta) &=& \theta^{x} (1 - \theta)^{1 - x} & ~~~ \because (\ref{bernoulli}) \nonumber \\ \varphi(\theta) &=& \frac{ 1 }{ B(a, b) } \theta^{ a - 1 } (1 - \theta)^{ b - 1 } & ~~~ \because (\ref{beta}) \nonumber \end{eqnarray} となる事から \begin{eqnarray} p(\theta | x^{n} ) &=& \frac{ 1 }{ Z_{n} } \prod_{j} \theta^{ x_{j} } (1 - \theta)^{ 1 - x_{j} } \cdot \frac{ \theta^{ a - 1 } (1 - \theta)^{ b - 1 } }{ B(a, b) } \nonumber \\ &=& \frac{ 1 }{ Z_{n} } \theta^{ \sum x_{j} } (1 - \theta)^{ n - \sum x_{j} } \cdot \frac{ \theta^{ a - 1 } (1 - \theta)^{ b - 1 } }{ B(a, b) } \nonumber \\ &=& \frac{ 1 }{ Z_{n} \cdot B(a, b) } \theta^{ a + \sum x_{j} - 1 } \cdot (1 - \theta)^{ n + b - \sum x_{j} - 1 } \nonumber \\ \end{eqnarray} が成立する。

ここで $p(\theta | x^{n})$ が確率分布 ($\therefore \int_{0}^{1} p(\theta | x^{n}) d\theta = 1 $) であり $ Z_{n} \cdot B(a, b) $ がその規格化定数である事から \begin{eqnarray} Z_{n} \cdot B(a, b) &=& \int_{0}^{1} \theta^{ a + \sum x_{j} - 1 } (1 - \theta)^{ n + b - \sum x_{j} - 1 } d\theta \nonumber \\ \nonumber \\ &=& B(a + \sum_{j=1}^{n} x_{j}, n + b - \sum_{j=1}^{n} x_{j}) ~~~ (\because ベータ関数の定義) \nonumber \end{eqnarray} となり、よって \begin{eqnarray} p(\theta | x^{n}) &=& \frac{ \theta^{ a + \sum x_{j} - 1} (1 - \theta)^{ n + b - \sum x_{j} - 1 } }{ B(a + \sum x_{j}, n + b - \sum x_{j}) } \nonumber \\ \nonumber \\ &=& Beta(\theta | a + \sum_{j=1}^{n} x_{j}, n + b - \sum_{j=1}^{n} x_{j}). ~~~ (\because ベータ分布の定義) \nonumber \end{eqnarray}
\begin{eqnarray} \label{post_theta} \therefore p(\theta | x^{n}) = Beta(\theta | a + \sum_{j=1}^{n} x_{j}, n + b - \sum_{j=1}^{n} x_{j}). \end{eqnarray}

1.1.1 MAP


($\ref{post_theta}$) より事後分布 $p(\theta | x^{n})$ がベータ分布に従う事から以下ではベータ分布の極値を求める事により事後分布 $p(\theta | x^{n})$ の点推定値の 1 つである MAP(Maximum A Posteriori: 最大事後確率) を導出する。
\begin{eqnarray} \frac{d}{d\theta} Beta(\theta | \alpha, \beta) &=& \frac{d}{d\theta} \frac{1}{B(\alpha, \beta)} \theta^{\alpha-1} \cdot (1-\theta)^{\beta-2} \nonumber \\ &=& \frac{1}{B(\alpha, \beta)} \{ (\alpha-1) \theta^{\alpha-2} \cdot (1 - \theta)^{\beta-1} + \theta^{\alpha-1} \cdot (\beta-1)(1-\theta)^{\beta-2} (-1) \} \nonumber \\ &=& \frac{1}{B(\alpha, \beta)} \theta^{\alpha-2} \cdot (1-\theta)^{\beta-2} \{ (\alpha-1) \cdot (1-\theta) - \theta \cdot (\beta-1) \} \nonumber \\ &=& \frac{1}{B(\alpha, \beta)} \theta^{\alpha-2} \cdot (1-\theta)^{\beta-2} \{ (\alpha-1) - (\alpha + \beta - 2) \theta \} \nonumber \end{eqnarray} により \begin{eqnarray} \frac{d}{d\theta} Beta(\theta | \alpha, \beta) = 0 \nonumber \\ \Leftrightarrow \theta = \frac{\alpha-1}{\alpha+\beta-2} . \nonumber \end{eqnarray} 上記の成立および事後分布 ($\ref{post_theta}$) で $\alpha = a + \sum x_{j}, \beta = n + b - \sum x_{j}$ と読み替える事により \begin{eqnarray} \label{MAP} \therefore \hat{\theta}_{MAP} = \frac{a + \sum x_{j} - 1}{n + a + b - 2}. \end{eqnarray}

1.1.2 MLE


ここでは上記で考えた事後分布とは別に ($\ref{bernoulli}$) に従って尤度関数 $L(\theta)$ を考える事により MLE(Maximum Likelihood Estimator: 最尤推定量) の実現値 $\hat{\theta}_{MLE}$ を導出する。 \begin{eqnarray} L(\theta) &=& p(x^{n} | \theta) \nonumber \\ &=& \prod_{j=1}^{n} \theta^{x_{j}} (1 - \theta)^{1 - x_{j}} \nonumber \\ &=& \theta^{\sum x_{j}} \cdot (1 - \theta)^{n - \sum x_{j}} \nonumber \end{eqnarray} により対数尤度関数 $log L(\theta)$ を $\theta$ で微分して下記を得る。 \begin{eqnarray} \frac{d}{d\theta} log L(\theta) &=& \frac{d}{d\theta} \{ (\sum_{j=1}^{n} x_{j}) \cdot log \theta + (n - \sum_{j=1}^{n} x_{j}) \cdot log(1 - \theta) \} \nonumber \\ &=& \frac{\sum x_{j}}{\theta} - \frac{n - \sum x_{j}}{1 - \theta}. \nonumber \end{eqnarray} よって \begin{eqnarray} &&\frac{d}{d\theta} log L(\theta) = 0 \nonumber \\ \nonumber \\ &\Leftrightarrow& \frac{\sum x_{j}}{\theta} = \frac{n - \sum x_{j}}{1 - \theta} \nonumber \\ &\Leftrightarrow& \theta = \frac{1}{n} \sum_{j=1}^{n} x_{j}. \nonumber \end{eqnarray} \begin{eqnarray} \label{MLE} \therefore \hat{\theta}_{MLE} = \frac{1}{n} \sum_{j=1}^{n} x_{j}. \end{eqnarray}

1.1.3 無情報事前分布における MAP と MLE の一致


MAP ($\ref{MAP}$) における事前分布として無情報事前分布を適用する事を考える。
具体的には ($\ref{beta}$) における $a = b = 1$ の適用であり、$Beta(\theta | 1, 1)$ は定義域 $[0, 1]$ における一様分布である。
このとき下記が成立し、無情報事前分布における MAP($\ref{MAP}$) と MLE($\ref{MLE}$) の一致というよく知られた結果が導出される。 \begin{eqnarray} \hat{\theta}_{MAP} &=& \frac{1 + \sum x_{j} - 1}{n + 1 + 1 - 2} \nonumber \\ &=& \frac{1}{n} \sum_{j=1}^{n} x_{j} \nonumber \\ &=& \hat{\theta}_{MLE}. \nonumber \end{eqnarray}

1.2 予測分布


事後分布 $p(\theta | x^{n})$ による確率モデル $p(x|\theta)$ の期待値を予測分布(predictive distribution) $p^{\ast}(x)$ と定義する。 \begin{eqnarray} p^{*}(x) \stackrel{\mathrm{def}}{=} E_{ p(\theta | x^{n}) }[ p(x | \theta)]. \nonumber \end{eqnarray} ここで ($\ref{bernoulli}$) および事後分布 ($\ref{post_theta}$) により予測分布 $p^{\ast}(x)$ は下記で表される。 \begin{eqnarray} p^{\ast}(x) &=& E_{ p(\theta | x^{n}) }[ p(x | \theta)] \nonumber \\ &=& \int_{0}^{1} p(x | \theta) \cdot p(\theta | x^{n}) d\theta \nonumber \\ &=& \int_{0}^{1} Bernoulli(x | \theta) \cdot Beta(a + \sum x_{j}, b + b - \sum x_{j}) d\theta \nonumber \\ &=& \int_{0}^{1} \theta^{x} (1 - \theta)^{ 1 - x } \cdot \frac{ \theta^{ \alpha - 1 } (1 - \theta)^{ \beta - 1 } }{ B(\alpha, \beta) } d\theta \nonumber \\ \label{pred_dist} &=& \frac{ B(\alpha + x, \beta - x + 1) }{ B(\alpha, \beta) }. \end{eqnarray} ただし上記において $\alpha \stackrel{\mathrm{def}}{=} a + \sum x_{j}, \beta \stackrel{\mathrm{def}}{=} n + b - \sum x_{j}$ により $\alpha$ と $\beta$ を定義するものとする。

1.2.1 EAP


予測分布 ($\ref{pred_dist}$) において特に $x=1$ とおくと \begin{eqnarray} p^{*}(x=1) &=& \int_{0}^{1} \theta \cdot \frac{ \theta^{ \alpha - 1 } (1 - \theta)^{ \beta - 1 } }{ B(\alpha, \beta) } d\theta \nonumber \\ &=& \int_{0}^{1} \theta \cdot p(\theta | x^{n}) d\theta \nonumber \\ &=& E_{ p(\theta | x^{n}) }[\theta]. \nonumber \end{eqnarray}
ここで事後分布 $p(\theta | x^{n})$ における $\theta$ の期待値(平均) $E_{ p(\theta | x^{n}) }[\theta]$ を EAP(Expectd A Posterior estimate) 推定値と呼び、下記が成立する。 \begin{eqnarray} \hat{\theta}_{EAP} &\stackrel{\mathrm{def}}{=}& E_{ p(\theta | x^{n}) }[\theta] \nonumber \\ &=& p^{*}(x=1) \nonumber \\ \label{EAP_incomplete} &=& \frac{ B(\alpha + 1, \beta) }{ B(\alpha, \beta) }. \end{eqnarray} ここでベータ関数の性質より \begin{eqnarray} B(\alpha + 1, \beta) &=& \int_{0}^{1} x^{ \alpha } (1 - x)^{ \beta - 1 } dx \nonumber \\ &=& [ x^{\alpha} \cdot \frac{1}{\beta} (1 - x)^{\beta} (-1) ]_{0}^{1} + \frac{\alpha}{\beta} \int_{0}^{1} x^{\alpha-1} (1 - x)^{\beta} dx \nonumber \\ &=& \frac{\alpha}{\beta} \int_{0}^{1} x^{\alpha-1} (1-x)^{\beta-1} (1-x)^{1} dx \nonumber \\ &=& \frac{\alpha}{\beta} ( \int_{0}^{1} x^{\alpha-1} (1-x)^{\beta-1} dx - \int_{0}^{1} x^{\alpha}(1-x)^{\beta-1} dx ) \nonumber \\ &=& \frac{\alpha}{\beta} ( B(\alpha, \beta) - B(\alpha + 1, \beta) ). \nonumber \end{eqnarray} 右辺の $B(\alpha + 1, \beta)$ を移項して \begin{eqnarray} (1 + \frac{\alpha}{\beta}) B(\alpha + 1, \beta) = \frac{\alpha}{\beta} B(\alpha, \beta). \nonumber \end{eqnarray} よって \begin{eqnarray} \label{beta_them} \therefore B(\alpha + 1, \beta) = \frac{\alpha}{\alpha + \beta} B(\alpha, \beta). \end{eqnarray} 上記 ($\ref{beta_them}$) を ($\ref{EAP_incomplete}$) に適用する事で下記を得る。 \begin{eqnarray} \hat{\theta}_{EAP} &=& \frac{ B(\alpha + 1, \beta) }{ B(\alpha, \beta) } \nonumber \\ &=& \frac{1}{B(\alpha, \beta)} \cdot \frac{\alpha}{\alpha + \beta} B(\alpha, \beta) \nonumber \\ &=& \frac{ \alpha }{ \alpha + \beta } \nonumber \\ &=& \frac{ a + \sum x_{j} }{ a + b + n }. \nonumber \end{eqnarray}
\begin{eqnarray} \label{EAP} \therefore \hat{\theta}_{EAP} = \frac{ a + \sum x_{j} }{ a + b + n }. \end{eqnarray}

1.3 まとめ


\begin{eqnarray} X &\sim& Bernoulli(\theta) \nonumber \\ \theta &\sim& Beta(a, b) \nonumber \end{eqnarray} の下で下記が成立。 \begin{eqnarray} p(\theta | x^{n}) &=& Beta(a + \sum_{j=1}^{n} x_{j}, n + b - \sum_{j=1}^{n} x_{j}) \nonumber \\ \hat{\theta}_{MAP} &=& \frac{a + \sum x_{j} - 1}{n + a + b - 2} \nonumber \\ \hat{\theta}_{EAP} &=& \frac{ a + \sum x_{j} }{ a + b + n } \nonumber \\ \hat{\theta}_{MLE} &=& \frac{1}{n} \sum_{j=1}^{n} x_{j} \nonumber \\ p^{\ast}(x) &=& E_{ p(\theta | x^{n}) }[ p(x | \theta)] \nonumber \end{eqnarray}

2 実データで試す


8 章に記載されている将棋の藤井七段の戦績データを用いて勝率を推定していく。

2.1 データ

生データ及びこの後に記載する R のコードは fujii_game_results@github を参照
※スクレイピング用のコードも上記にあり

ネット上のデータ から 2016年〜2019年 の対戦成績を取得し [対戦日 / 先行or後攻 / 勝敗] の 3 項目を csv にまとめている。
date first_or_second result
2016-12-24
2017-01-26
2017-02-09

2.2 勝率の推定


事前分布として Beta 分布を仮定し、($\ref{MAP}$) ($\ref{MLE}$) ($\ref{EAP}$) により各種推定値の推移を可視化する。

2.2.1 事前分布


事前分布として $Beta(\theta | 2, 2)$ を仮定する。
library(tidyverse)

# 事前分布
a <- 2
b <- 2
tibble(theta = seq(0, 1, 0.01), density = dbeta(theta, a, b)) %>%
  ggplot(aes(theta, density)) +
    geom_line()

事前分布


2.2.2 分析データの生成


事前に算出した MAP/EAP/MLE により勝率を推定したデータを作成。
df.results <- readr::read_csv(
  file = "https://raw.githubusercontent.com/you1025/fujii_game_results/master/data/fujii.csv",
  col_types = cols(
    date = col_date(format = ""),
    first_or_second = col_character(),
    result = col_character()
  )
) %>%

  dplyr::mutate(
    # 対戦番号の付与
    game = dplyr::row_number(),

    # 先攻フラグ
    flg_first = (first_or_second == "先"),

    # 勝利フラグ
    flg_win = (result == "○"),

    # 通算勝利数
    cumsum_win = cumsum(flg_win),

    # 推定値
    MLE = cumsum_win / game,
    EAP = (a + cumsum_win) / (a + b + game),
    MAP = (a + cumsum_win - 1) / (a + b + game - 2)
  ) %>%

  # 対戦前のレコードを追加
  dplyr::bind_rows(tibble(game = 0, cumsum_win = 0, EAP = a / (a + b))) %>%
  dplyr::arrange(game) %>%

  # 事後分布の 2.5%, 97.5% タイルを算出
  dplyr::mutate(
    q.025 = qbeta(p = 0.025, shape1 = a + cumsum_win, shape2 = b + game - cumsum_win),
    q.975 = qbeta(p = 0.975, shape1 = a + cumsum_win, shape2 = b + game - cumsum_win)
  ) %>%

  dplyr::select(
    game,
    flg_first,
    flg_win,
    cumsum_win,
    MLE,
    EAP,
    MAP,
    q.025,
    q.975
  )
game flg_first flg_win cumsum_win MLE EAP MAP q.025 q.975
0 NA NA 0 NA 0.500 NA 0.094 0.905
1 F T 1 1.000 0.600 0.666 0.194 0.932
2 T T 2 1.000 0.666 0.750 0.283 0.947


2.2.3 勝率の推移


# 勝率の推移
df.results %>%
  ggplot(aes(game)) +
    geom_line(aes(y = MLE), linetype = 2, alpha = 1/2) +
    geom_line(aes(y = EAP), linetype = 1, colour = "tomato") +
    geom_line(aes(y = MAP), linetype = 1, colour = "blue", alpha = 1/3) +
    geom_ribbon(aes(ymin = q.025, ymax = q.975), alpha = 1/7) +
    scale_y_continuous(limits = c(0, 1), labels = scales::percent) +
    labs(
      x = "Games",
      y = NULL
    )

勝率の推移


  • 対戦数の少ない段階では MLE(黒色点線) の勝率が 100% と過度にデータを反映した値になってしまっている事がわかる
  • EAP(赤色) が最も低い値となっており MAP(青色) が EAP と MLE の間に挟まれるような値となっている
  • 対戦が進むにつれ 2.5%〜97.5% タイルの幅が狭くなり確信が高まっていく様子が見て取れる

2.2.4 事後分布の変遷


# 対戦ごとの事後分布の一覧
df.results %>%

  dplyr::mutate(
    # 対戦が進む度に事後分布を推定する
    data = map2(game, cumsum_win, function(game, cumsum_win) {
      tibble(
        x = seq(0, 1, 0.001),
        d = dbeta(x, shape1 = a + cumsum_win, b + game - cumsum_win)
      )
    })
  ) %>%
  tidyr::unnest(data) %>%

  ggplot(aes(x, d)) +
    geom_line(aes(group = game, colour = game), alpha = 1/3) +
    scale_colour_gradient(low = "blue", high = "tomato") +
    labs(
      x = "勝率",
      y = NULL
    ) +
    scale_x_continuous(labels = scales::percent) +
    theme_gray(base_family = "Osaka")

事後分布の推移



  • 対戦が進む(赤色が強くなる)ごとに 80% 付近にピークが集まり、高さが増していく事から確信が高まっている様子が見て取れる


参考