読者です 読者をやめる 読者になる 読者になる

y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

続パタ 第 3 章「ベイズ決定則」の復習

前回の記事に続き、『続・わかりやすいパターン認識』の例題を実装しながら内容を確認します。今回は第 3 章「ベイズ決定則」です。

第 3 章の例題は、前回の記事と同じ設定のコイン投げを題材にして、観測結果 (あるコインを n 回投げて、そのうち r 回が表だった) が得られたもとで 3 種類のコイン ω1, ω2, ω3 のいずれが選ばれていたかを識別するというものです。3 種類のコインそれぞれの含有率、表の出る確率といった設定は、前回の記事で教科書の内容を引用していますので、そちらを参照してください。
続パタ 2.3 節「ベイズ更新の実験」を試す - y_uti のブログ

教科書 3.2 節「事後確率最大化」で説明されているとおり、この問題は、3 種類のコイン ω1, ω2, ω3 が選ばれる事後確率をそれぞれ計算して、確率が最大になるコインを選択するという方法で解きます。コインを 10 回投げて r 回表が出たときの事後確率の様子をグラフにしたものが教科書の図 3.2 です。まず、この図を MATLAB で実際に描画してみます。

p = [0.1 0.4 0.5]; % パラメータ π
t = [0.8 0.6 0.3]; % パラメータ θ
n = 10;            % コインを投げた回数

% 事後確率を計算: M の i 行 j 列は n 回のうち表が i 回出たという観測のもとでコインが ωj である確率を表す
M = bsxfun(@times, p, bsxfun(@(X, P) binopdf(X, n, P), (0:n)', t));
M = bsxfun(@rdivide, M, sum(M, 2));

% 結果をプロット
plot(0:n, M);
xlim([0 n]);
ylim([0 1]);

結果は次のとおりです。たしかに教科書の図と一致しました。
f:id:y_uti:20151019084518p:plain

教科書の 3.3 節「事前確率の効果」では、コインを投げる回数 n が大きくなるにつれて事前確率の影響が小さくなっていくことが説明されています。図 3.3 では、n = 100 での事後確率のグラフが示されています。そこで今回は、n の増加にともなってグラフの形が変わっていく様子をアニメーションにして眺めてみます。先ほどのプログラムで n を 1 から 100 までループさせながらグラフを描画します*1
f:id:y_uti:20151019085137g:plain

教科書の 3.4 節「ベイズ誤り確率」の計算を試してみます。教科書で説明されている数式のとおり、次のように計算できます。教科書どおりのパラメータを設定して観測回数 n = 10 で計算すると、E の値は 0.2226 と求まり、教科書の結果と一致します。

% ここでの M の i 行 j 列は、コイン ωj が選ばれて n 回のうち i 回が表になる確率
M = bsxfun(@times, p, bsxfun(@(X, P) binopdf(X, n, P), (0:n)', t));

% Msum は M を列方向に合計したもの。n 回のうち i 回が表になる確率 [教科書の式 (3.29)]
Msum = sum(M, 2);

% M を Msum で割る。n 回のうち表が i 回出たという観測のもとでコインが ωj である確率
M = bsxfun(@rdivide, M, Msum);

% (1 - M) の行ごとの最小値。条件付きベイズ誤り確率 [教科書の式 (3.28)]
Er = min(1 - M, [], 2);

% ベイズ誤り確率 [教科書の式 (3.31)]
E = sum(Er .* Msum);

n を 1 から 100 まで変化させてベイズ誤り確率をプロットしたものが次のグラフです。教科書の図 3.4 の結果が得られます*2
f:id:y_uti:20151020234609p:plain

最後に、この章で登場したいくつかの確率を並べて、n についてアニメーションさせてみます。
f:id:y_uti:20151021011149g:plain
一番上のグラフは、n 回のうち表が r 回出たという観測のもとで、コインが ωi であった確率 Pni|r) です。これは今回の記事の前半でも掲載しました。

二番目のグラフは、その観測のもとでコイン ωi を推定したときの条件付きベイズ誤り確率 eB(r) です。一番目のグラフと合わせて眺めると、識別結果が変わる境界*3近くでは条件付きベイズ誤り確率がほぼ 0.5 になり、逆に、いずれか一種類のコインの確率が 1 に近いところでは条件付きベイズ誤り確率は 0 に近くなります。教科書 46 ページの下記の記述のとおりです。

このように eb(r) は、図 3.2 において 3 つのグラフの最大値部分を抽出し、上下を反転させた形であることがわかる。

三番目のグラフは、含有率 πi = { 0.1, 0.4, 0.5 } にしたがってコインを一枚選び、そのコインを n 回投げたときに表が r 回出る確率 Pn(r) です。各コインで表の出る確率 θi = { 0.8, 0.6, 0.3 } にピークが現れ、それぞれのピークは含有率に応じた高さになります。このグラフは、n が大きくなるにつれて y 軸のスケールが小さくなっていることに注意してください。これは、n を大きくしていくほど、r が特定の一つの値になる確率は小さくなっていくことを表しています。先ほどのグラフで、識別結果の境界付近で条件付きベイズ誤り確率の値が 0.5 程度になる様子を見ましたが、このグラフを合わせてみると、実際にコイン投げを繰り返したときに r が境界付近の値になることはまれであることがわかります。

最後のグラフは、二番目のグラフと三番目のグラフを掛け合わせた eB(r) * Pn(r) です。ここから r について総和をとると、ベイズ誤り確率 eB になります。このグラフも、n が大きくなるにつれて y 軸のスケールが小さくなっていきます。先ほどのグラフで確かめたように、r が境界付近の値になることはまれであるため、最終的に得られるベイズ誤り確率は小さな値になっていきます。また、三番目のグラフを改めて見てみると、条件付きベイズ誤り確率の二つのピークのうち、r/n = 0.7 近くの値を取る確率の方が、他方に比較してより大きな値になっています。そのため、最後のグラフでは右側のピークの方が高くなっています。

[2015-10-21 追記] ベイズ誤り確率のグラフについて説明を追加しました。

*1:アニメーション GIF の画像は、前回の記事と同様に imwrite 関数を利用して作成しました。

*2:教科書の図 3.4 は左端が n = 10 になっていまることに注意してください。グラフの左端でベイズ誤り確率の値が大きく異なっているのは、n の値が異なるためです。

*3:一番上のグラフで線が交差しているところが境界になります。