ひとことで言うと
周辺確率は、同時分布から注目しない変数を足し合わせて消したものです。条件付き確率は、ある事象が起きたという情報のもとで、別の事象の確率を測り直したものです。前者は「変数を隠す」操作、後者は「情報を固定する」操作なので、似た記号でも役割が違います。
同時分布を、天気と来店者数を一緒に記録した集計表だとします。天気を気にせず来店者数だけ知りたいなら、天気の行を合計するのが周辺化です。一方、「雨の日だけ」に表を絞って来店者数を見直すのが条件付けです。
なぜ必要か
実装では、データに含まれる全変数を常に観測できるとは限りません。ある変数を使わずに予測したい、欠損した変数を積分して不確実性を残したい、ある観測を前提に分布を更新したい、といった場面で同時分布をそのまま扱うと計算の焦点がぼやけます。そこで、必要な変数だけを残す周辺化と、観測済みの値に合わせて切り出す条件付けを使い分けます。
特に混乱しやすいのは、「 の確率が小さい」と「 を知ったときの の確率が小さい」が別の主張だという点です。 は 自体の起こりやすさ、 は が起きた世界の中での の起こりやすさです。珍しい入力でも、その入力ならほぼ確実な出力はあり得ます。逆に、よくある入力でも出力が不確実なことはあります。
周辺化は期待値にも現れます。 の値を直接使わず、 だけについて評価するなら、まず から を作り、その分布で平均します。欠損値を一つの代表値で埋めてしまうと、隠れた値の不確実性を消してしまいますが、周辺化なら可能な値の重み付き平均として残せます。
条件付き確率を計算するときは、分子に同時確率、分母に「条件として固定した側」の周辺確率を置きます。分母を足し忘れると値が確率分布として正規化されず、周辺化と条件付けを混同したまま実装が通ってしまうので、最後に条件側について合計が1になるかを確認します。
仕組み
離散確率変数 と の同時確率を とします。 を観測しないときの の周辺確率は、 の全ての値を合計して得ます。連続変数なら合計を積分に置き換えます。
ここで は の同時確率、 は だけに注目した確率です。条件付き確率は、分母が0でないとき、同時確率を条件側の周辺確率で割ります。
の縦棒の右側は、確率を計算する世界を に限定する印です。したがって「分母の を掛け忘れる」と同時分布に戻れません。この分解は連鎖律です。変数の順序は自由で、同じ同時分布を
とも書けます。多変数でも、先にどの変数を条件側へ回すかで式の見た目は変わりますが、各因子を条件付き確率として正しく定義すれば同じ同時分布を表します。
独立とは、片方を知ってももう片方の確率が変わらないことです。全ての値について
が成り立つとき、 と は独立です。これに対して、別の変数 を知った後だけ独立になる条件付き独立は
です。独立なら条件付き独立になるとは限らず、条件付き独立でも条件を外すと依存することがあります。共通原因を固定すると相関が消える場合もあれば、逆に選別条件を固定したことで依存が生じる場合もあるため、 の有無を式に残して判断します。
機械学習との接続では、識別的な学習は主に を直接モデル化し、生成的な学習は を扱います。ここで重要なのは名称の暗記より、実装が条件付き分布を出すのか、同時分布を分解して出すのかを見抜くことです。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 同時分布から周辺確率を求める | 消す変数について離散なら総和、連続なら積分を取る | 残す変数について足し合わせる |
| 条件付き確率を同時分布で表す | とし、分母は条件側 | 分母を にする、または割らずに済ませる |
| 連鎖律の分解を選ぶ | など、順序に対応した分解 | 条件の右側と周辺確率の対応を崩す |
| 独立性を判定する | または が全域で成立 | 一部の値で一致しただけで独立とする |
| 条件付き独立を判定する | を固定した の因数分解を見る | を外した独立性と同一視する |
| 「確率が小さい」を読む | と は別の量として評価する | 珍しい なら も必ず珍しいと推測する |
実装で確かめる
小さな同時分布を作り、総和で周辺化し、条件付き確率を計算します。条件付き独立は、 の値ごとに表を切り出したときに確認できます。
import numpy as np
p_xy = np.array([[0.40, 0.10], [0.10, 0.40]]) # 行X、列Y
p_x = p_xy.sum(axis=1) # Yを周辺化
p_y_given_x = p_xy / p_x[:, None]
print("p(X):", p_x)
print("p(Y|X=0):", p_y_given_x[0])
print("joint check:", np.allclose(p_xy, p_y_given_x * p_x[:, None]))
実行結果は p(X): [0.5 0.5]、p(Y|X=0): [0.8 0.2]、joint check: True です。 の周辺確率は と小さくありませんが、その条件で となる確率は です。この例ではさらに、 は と異なるため、 と は独立ではありません。周辺化した結果だけを見て、同時分布の構造まで独立と判断してはいけません。
取り違えやすいもの
| 用語 | 切り分け |
|---|---|
| 同時確率 | と が同時に起きる確率。条件を絞っていない |
| 周辺確率 | を総和・積分で消して得る。観測しない変数を残さない |
| 条件付き確率 | の世界に限定した の確率。同時確率を で正規化する |
| 独立 | 条件を付けなくても が成り立つ関係 |
| 条件付き独立 | を固定したときだけ が成り立つ関係 |
| 期待値の周辺化 | 隠れた変数の取り得る値を確率で重み付けして平均する操作 |
想起チェック
周辺確率で消す変数は、総和や積分のどの側か
残したい変数ではなく、注目しない変数です。 のように を消します。
条件付き確率と同時確率の関係は
で、逆に です。条件側の周辺確率で正規化します。
独立と条件付き独立は、なぜ同じ判定ではないか
独立は条件なしの 、条件付き独立は を固定した です。条件を付ける前後で関係が変わり得ます。
入力の確率が小さいことから、条件付きの出力確率も小さいと言えるか
言えません。 は入力自体の頻度、 はその入力に限定した出力の頻度で、別の量です。