Mímisbrunnr知恵の泉

← ベイズ統計 一覧

🎓 レベル:発展 | 重要度:B(標準)

📎 前提:ベイズ深層学習と不確実性 | 関連:混合ガウスモデルとEM(機械学習)

要点(BLUF)

1. パラメータ数を固定しない発想

混合ガウスモデル(混合ガウスモデルとEM)では、クラスタ数 KK事前に決める必要がありました。でも本当は「いくつのクラスタがあるか」自体がデータから知りたいこと。ノンパラメトリックベイズは、潜在的に無限個のクラスタを許し、データが必要とするぶんだけ使う、という発想で KK を決め打ちしません。「パラメータがない」のではなく、パラメータ数が無限(データとともに増える)——だからノンパラメトリックです。

2. ディリクレ過程:2つの見方

ディリクレ過程 DP(α,G0)\mathrm{DP}(\alpha, G_0) は、無限個のクラスタの混合比 {wk}\{w_k\} を生む事前です。集中度 α\alpha が「いくつのクラスタに広がるか」を、基底分布 G0G_0 が各クラスタのパラメータの分布を決めます。2つの等価な見方があります。

(A) スティック折り(stick-breaking):長さ1の棒を折り続けて無限個の重みを作ります。

βkBeta(1,α),wk=βkj<k(1βj)\beta_k\sim\mathrm{Beta}(1,\alpha),\qquad w_k=\beta_k\prod_{j<k}(1-\beta_j)

毎回「残りの棒の割合 βk\beta_k」を折り取るので、重みは(確率的に)減衰し、和が 11 になります。α\alpha が大きいほど多くのクラスタに分散します。

(B) 中国料理過程(CRP):客(データ)がレストランのテーブル(クラスタ)に座る比喩。ii 番目の客は、

P(既存テーブル k)=nkα+i1,P(新テーブル)=αα+i1P(\text{既存テーブル }k)=\frac{n_k}{\alpha+i-1},\qquad P(\text{新テーブル})=\frac{\alpha}{\alpha+i-1}

人気のテーブルほど座られやすい(rich get richer)」一方、確率 α/(α+i1)\alpha/(\alpha+i-1) で新テーブルが開きます。これがクラスタ数を自動で増やす仕組みです。

3. コード:スティック折りの重みと CRP のクラスタ数

import numpy as np

# (A) スティック折り:w_k = β_k Π_{j<k}(1-β_j), β_k~Beta(1,α)
def stick_breaking(alpha, K=15, seed=0):
    rng = np.random.default_rng(seed)
    betas = rng.beta(1, alpha, K)
    return betas * np.cumprod(np.concatenate([[1.0], 1-betas[:-1]]))
for alpha in [1.0, 5.0]:
    w = stick_breaking(alpha)
    print(f"α={alpha}: 上位5重み={np.round(w[:5],3)} 累積={w.sum():.3f}")

# (B) 中国料理過程:客 n 人のテーブル数(クラスタ数)
def crp_tables(n, alpha, seed):
    rng = np.random.default_rng(seed); counts = []
    for i in range(n):
        probs = np.array(counts + [alpha], float); probs /= probs.sum()
        j = rng.choice(len(probs), p=probs)
        if j == len(counts): counts.append(1)            # 新テーブル
        else: counts[j] += 1
    return len(counts)

print("\nCRP:テーブル数の平均 vs 理論 Σα/(α+i-1)(500回平均)")
for n in [50, 500, 5000]:
    for alpha in [1.0, 3.0]:
        emp = np.mean([crp_tables(n, alpha, s) for s in range(500)])
        theory = alpha*np.sum([1/(alpha+i) for i in range(n)])
        print(f"  n={n:>5}, α={alpha}: 平均={emp:.2f}  理論={theory:.2f}  (α·ln n={alpha*np.log(n):.2f})")

出力:

α=1.0: 上位5重み=[0.702 0.212 0.085 0.    0.   ] 累積=1.000
α=5.0: 上位5重み=[0.134 0.001 0.076 0.503 0.1  ] 累積=0.978

CRP:テーブル数の平均 vs 理論 Σα/(α+i-1)(500回平均)
  n=   50, α=1.0: 平均=4.72  理論=4.50  (α·ln n=3.91)
  n=  500, α=1.0: 平均=7.07  理論=6.79  (α·ln n=6.21)
  n= 5000, α=1.0: 平均=9.36  理論=9.09  (α·ln n=8.52)
  n= 5000, α=3.0: 平均=23.06  理論=22.78  (α·ln n=25.55)

出力の意味:スティック折りでは、α=1\alpha=1 なら最初の数個に重みが集中(0.70,0.21,0.70,0.21,\dots)、α=5\alpha=5 ならより多くのクラスタに分散します。CRP のテーブル数(クラスタ数)は理論値 iα/(α+i1)\sum_i\alpha/(\alpha+i-1) とよく一致し、nn50500050\to5000 と100倍になってもクラスタ数は 4.79.44.7\to9.4ゆっくり(対数的に αlogn\alpha\log n で)増えるだけ。クラスタ数を事前に決めず、データ量と α\alpha から自然に決まります。α\alpha が大きいほどクラスタが増えやすい(α=3\alpha=32323 個)。

4. ディリクレ過程混合モデル

DP を混合モデルの事前にしたのが DP 混合モデル(無限混合モデル)。各データ点に CRP でクラスタを割り当て、各クラスタのパラメータを G0G_0 から引き、観測を生成します。推論(ギブスや変分)でクラスタ割り当てとパラメータを同時に求めると、データが要求するクラスタ数が事後的に決まります。「KK をいくつにするか」を交差検証や情報量規準(第8章)で選ぶ代わりに、モデルが自動で調整する——これがノンパラメトリックベイズの実用的な魅力です。関連して、ガウス過程(ガウス過程)も「関数空間の無限次元事前」で、ノンパラメトリックベイズの一員です。

⚠️ よくある誤解

まとめ(Phase 10・テキスト全体)

第10章では、有限パラメータの枠を超える発展——関数への事前(ガウス過程、ガウス過程)、深層モデルの不確実性(ベイズ深層学習と不確実性)、無限次元の混合(本ノート)——に触れました。

そして本テキスト全体を振り返ると、ベイズ推論の枠組み(第1章)から共役(第2章)・事後の解析(第3章)・MCMC(第4章)・階層モデル(第5章)・変分推論(第6章)・回帰とGLM(第7章)・モデル評価(第8章)・確率的プログラミング(第9章)・発展(第10章)まで、「事後 ∝ 尤度 × 事前」という一つの原理が、計算(共役・MCMC・変分)・モデル化(階層・回帰・ノンパラメトリック)・評価(予測・証拠)へと展開してきました。すべてのノートで、数式を実行可能な Python コードで確かめながら進めたのが本テキストの方針です。ここから先は、各自の問題に合わせてこれらの道具を組み合わせ、確率的プログラミング(第9章)で実装していく段階です。

関連ノート