EMアルゴリズム(1次元GMM)シミュレーター 戻る
統計学シミュレーター

EMアルゴリズム(1次元GMM)シミュレーター

2成分ガウス混合モデルをEM法で逐次推定する過程を可視化。Eステップ・Mステップを繰り返すたびに、混合分布が観測ヒストグラムにフィットしていく様子と、対数尤度が単調増加する様子を確認できます。

パラメータ設定
μ₁ 初期値
μ₂ 初期値
EM 反復回数
データ生成シード

固定: σ₁=σ₂=1.5、π₁=π₂=0.5(初期値)。真値: μ=(0, 4), σ=(1.0, 1.5), π=(0.4, 0.6), N=200。

計算結果
推定 μ₁(真値 0.0)
推定 μ₂(真値 4.0)
推定 π₁(真値 0.40)
最終対数尤度 LL
ヒストグラム・混合密度・LL 推移

上: ヒストグラム(灰)/真の混合密度(黒破線)/推定混合密度(青実線)/成分1(緑破線)/成分2(赤破線)。下: 反復ごとの対数尤度 LL[t](赤線、単調増加)。

理論・主要公式

2 成分ガウス混合モデル $p(x)=\pi_1\mathcal{N}(x|\mu_1,\sigma_1^2)+\pi_2\mathcal{N}(x|\mu_2,\sigma_2^2)$ を、E ステップと M ステップを反復する EM 法で推定します。

E ステップ(responsibility $\gamma_{ik}$ は、データ $x_i$ が成分 $k$ から生成された事後確率):

$$\gamma_{ik}=\frac{\pi_k\,\mathcal{N}(x_i|\mu_k,\sigma_k^2)}{\sum_j \pi_j\,\mathcal{N}(x_i|\mu_j,\sigma_j^2)}$$

M ステップ(責任度の重みで $\mu_k, \sigma_k^2, \pi_k$ を更新):

$$N_k=\sum_i \gamma_{ik},\quad \mu_k\leftarrow\frac{1}{N_k}\sum_i \gamma_{ik}\,x_i,\quad \sigma_k^2\leftarrow\frac{1}{N_k}\sum_i \gamma_{ik}(x_i-\mu_k)^2,\quad \pi_k\leftarrow\frac{N_k}{N}$$

対数尤度(EM の各反復で単調増加することが保証):

$$\mathrm{LL}=\sum_i \log\!\left(\sum_k \pi_k\,\mathcal{N}(x_i|\mu_k,\sigma_k^2)\right)$$

LL の単調増加は実装の正しさの確認に使えます。反復ごとに LL が下がる場合は計算式にバグがあります。

EMアルゴリズム(1次元GMM)シミュレーターとは

🙋
「EMアルゴリズム」ってよく聞くんですけど、結局なにをやってる方法なんですか?グラフ見ても2つの山が見えてるだけですけど…
🎓
ざっくり言うと「観測データの裏に潜む混合構造を推定する反復計算」だよ。上のヒストグラムは200点のデータで、本当は「中心0で標準偏差1」と「中心4で標準偏差1.5」の2つのガウス分布から生成されている。でも観測データだけ見ても「どっちの点がどっちの分布から来たか」はわからない。それを推定するのがEMだ。スライダーの「EM反復回数」を0から30に動かしてみて。青い実線(推定分布)が灰色のヒストグラムに重なっていくのが見えるはず。
🙋
EステップとMステップって何が違うんですか?片方だけじゃダメなんですか?
🎓
Eステップは「いまのパラメータのもと、各点がどの成分から来た確率が高いか」を計算する。これを「responsibility(責任度)」と呼ぶよ。Mステップはその責任度を重みにして、各成分のμ、σ²、混合比πを最尤推定で更新する。「データに重みを付ける(E)」と「重み付き平均で更新する(M)」を交互にやるわけ。下のLLプロットを見て。EMは反復するたびに対数尤度が必ず増えるんだ。これは数学的に保証された性質だよ。
🙋
なるほど!じゃあ「μ₁初期値」を変えると結果も変わるんですか?
🎓
そう、ここが実務でハマりやすいポイント。EMは局所最大値しか保証してくれない。μ₁初期値を1.0、μ₂初期値を3.0で始めると素直に真値(0と4)に収束するけど、両方を2.0付近に揃えると分離できなくなったり、片方が遠くに飛ばされたりする。だから現場では「ランダムな初期値で10回くらい走らせて、最も対数尤度が高いものを採用する」のが定石。あるいはK-meansで荒く初期化してからEMに切り替える。
🙋
K-meansって出てきましたが、それともEMの関係ってどうなってるんですか?
🎓
実はK-meansはGMMのEMの特殊ケース。分散を全成分で共通にして、σ→0の極限を取ると、責任度が「最も近い中心に対して1、それ以外0」になる。これがK-meansの「ハード割り当て」そのもの。EMは「ソフト割り当て(確率的に按分)」で、K-meansが「ハード割り当て(一発で決める)」。境界が曖昧な領域では、EMの方が情報を捨てずに済む利点があるよ。

よくある質問

混合数 K は事前にわからないことが多く、情報量規準 BIC = −2·LL + k·log(N)(k はパラメータ数、N はサンプル数)を使って決めるのが定番です。K=1, 2, 3, ... と試して BIC が最小になる K を選びます。AIC(罰則が緩く過適合気味)と BIC(節約的)の両方を見比べる実務もよく行われます。なお、解釈が必要な場面ではドメイン知識から K を固定する方が安全です。
複数のランダム初期値(例えば 10〜20 回)で EM を走らせ、最終 LL が最大の解を採用する「マルチスタート EM」が標準的です。あるいは K-means で粗くクラスタリングしてから EM に渡す二段階法も広く使われます。本ツールで μ₁ と μ₂ の初期値を真値から大きく離してみると、局所解にハマる挙動が確認できます。
クラスタが球形で同じ大きさ、境界がはっきりしている場合は K-means で十分です。クラスタの形が楕円・サイズが違う・重なりがある場合は GMM/EM が適しています。GMM は各点に確率(責任度)を出すので、境界付近の点を「どっちつかず」として扱える利点があります。実務ではまず K-means で雰囲気を掴み、必要に応じて GMM に進むのが効率的です。
「対数尤度 LL の増分 |LL[t]−LL[t−1]| が事前に決めた閾値(例 1e−4 や 1e−6)を下回ったら停止」が標準です。同時に最大反復回数(例 100〜1000)を上限として設定します。本シミュレーターの既定値(30 反復)でも本データセットなら十分収束します。LL の単調増加が崩れる場合は実装にバグがある証拠なので、まず数値安定化(ε 加算など)を見直してください。

実世界での応用

顧客セグメンテーションとマーケティング: 購買金額や来店頻度などの分布が複数のグループの重ね合わせになっている場合、GMM/EM で「優良顧客層」「一般層」「離反予備軍」といった潜在グループを推定し、施策を出し分けるのに使われます。K-means より柔軟に楕円形クラスタを扱えるのが利点です。

異常検知(Anomaly Detection): 正常データに GMM をフィットし、新しい点の対数尤度が極端に低ければ異常とみなします。製造ラインのセンサー時系列、ネットワークトラフィック、金融取引などで広く使われている古典的だが強力な手法です。

音声・画像処理: 音声認識の音響モデルでは長らく GMM-HMM が標準でした(近年は深層学習に置き換わりつつあるが、軽量モデルでは現役)。画像の前景・背景分離でも、画素の色分布を GMM でモデル化し、各画素が前景か背景かを推定する手法(例: GrabCut)が使われています。

欠損データの最尤推定: EM は GMM 以外にも、観測されない潜在変数を持つあらゆる確率モデルの最尤推定に適用できます。欠損値を「潜在変数」とみなせば、欠損ありデータの ML 推定もそのまま EM の枠組みで実行できます。混合モデルだけでなく、HMM、因子分析、PLSA、LDA など、多くの統計モデルの推定アルゴリズムの基礎となっています。

よくある誤解と注意点

最も多い誤解は、EM はグローバル最適解を返すと思い込むことです。EM の理論的保証は「対数尤度が反復ごとに単調増加する」「局所最大値(または鞍点)に収束する」までで、グローバル最適は保証されません。本シミュレーターで μ₁ 初期値を −2、μ₂ 初期値を 7 のように外して試すと、別の局所解に行きついて推定精度が下がるのが見えます。実務では必ずマルチスタート EM で複数の初期値を試し、最大 LL を採用してください。

次に多いのが、混合数 K を多く取れば取るほどフィットが良くなると考えてしまうことです。確かに K を増やせば対数尤度は単調に増えますが、これは過適合の典型です。学習データへのフィットが良くなる代わりに、未知データへの汎化が悪化します。BIC・AIC・交差検証などで K を選び、解釈性とのバランスを取る必要があります。「LL だけで K を決めない」が鉄則です。

最後に、数値安定化を怠ると EM が壊れる点に注意してください。Responsibility γ の分母が 0 に近づく、分散が 0 に潰れる、対数の中身が 0 になる、といった事態が起こりえます。本ツールではガウス pdf に分散の下限(1e−6)、対数尤度に微小値(1e−12)を加える、責任度の分子分母にも ε を入れる、といった処置を入れています。実装の際は ε の加算位置を統一し、「LL が単調増加するか」を毎反復で必ず確認するのが最も効率的なデバッグ法です。