← 機械学習テキスト 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:k-meansクラスタリング(硬い割り当ての特殊例) | 数理:欠測データ・EMアルゴリズム(統計, EMの一般論)・多変量正規分布(統計)

要点(BLUF)

1. なぜ「柔らかい」クラスタリングなのか

k-meansクラスタリング は各点をただ1つのクラスタに硬く割り当てました。「この点はクラスタ2」と白黒つける。でも現実のデータでは、2つのクラスタの境界付近にある点を「どちらか一方」と決めつけるのは無理があります。

GMM は「点 xnx_n は成分1に確率 0.7、成分2に確率 0.3 で属する」という確率的な所属(ソフトアサインメント)を許します。さらに k-means が暗黙に「等方的で同じ大きさの球状クラスタ」しか表せないのに対し、GMM は各成分が自前の共分散 Σk\Sigma_k を持つので、楕円形・向き・大きさの異なるクラスタを表現できます。

graph LR
    KM["k-means<br/>硬い割り当て・球状・等サイズ"] -->|"確率的所属を許す"| Soft["ソフトアサインメント"]
    KM -->|"成分ごとに共分散 Σ_k"| Shape["楕円・任意の向き・サイズ"]
    Soft --> GMM["混合ガウスモデル + EM"]
    Shape --> GMM
    GMM -.->|"Σ_k = εI, ε → 0 の極限"| KM

要するに:GMM は k-means に「所属の確率」と「クラスタの形」という2つの自由度を足したものです。そして後で見るように、自由度を削っていくと k-means に戻ります(双方向の矢印が本質)。

2. モデル定義:ガウス分布の重み付き和

GMM はデータの密度を KK 個のガウス分布の凸結合で表します:

p(x)=k=1KπkN(xμk,Σk)p(x) = \sum_{k=1}^{K} \pi_k\, \mathcal{N}(x \mid \mu_k, \Sigma_k)

ここで N(xμk,Σk)\mathcal{N}(x\mid\mu_k,\Sigma_k) は平均 μk\mu_k・共分散 Σk\Sigma_k の多変量正規分布(→ 多変量正規分布)、πk\pi_k は **混合係数(mixing coefficient)**で、次の制約を満たします:

πk0,k=1Kπk=1\pi_k \ge 0, \qquad \sum_{k=1}^{K} \pi_k = 1

要するにπk\pi_k は「成分 kk が全体に占める割合(重み)」です。確率の公理(非負・総和1)を満たすので、πk\pi_k 自体を確率分布として読めます。p(x)p(x) は単峰ではなく、KK 個の山を持つ多峰の密度を表現できます。

なぜ「凸結合なら密度になるか」も確認しておきます。各 N0\mathcal{N}\ge 0 で積分すると 1 なので、

p(x)dx=kπkN(xμk,Σk)dx=1=kπk=1\int p(x)\,dx = \sum_k \pi_k \underbrace{\int \mathcal{N}(x\mid\mu_k,\Sigma_k)\,dx}_{=\,1} = \sum_k \pi_k = 1

となり、p(x)p(x) はちゃんと正規化された確率密度になっています。

3. 潜在変数 zz の導入と完全データ尤度

GMM の核心は、「この点はどの成分から生成されたか」を表す潜在変数 zz を導入することです。zzKK 次元の one-hot ベクトルで、点が成分 kk から生まれたなら zk=1z_k=1、他は 0 とします(kzk=1\sum_k z_k = 1、これを 1-of-K 表現と呼びます)。

潜在変数の確率を、混合係数そのものとして定めます:

p(zk=1)=πkp(z)=k=1Kπkzkp(z_k = 1) = \pi_k \quad\Longleftrightarrow\quad p(z) = \prod_{k=1}^{K} \pi_k^{\,z_k}

成分が kk に決まったときの xx の条件付き分布は、その成分のガウスです:

p(xzk=1)=N(xμk,Σk)p(xz)=k=1KN(xμk,Σk)zkp(x \mid z_k = 1) = \mathcal{N}(x \mid \mu_k, \Sigma_k) \quad\Longleftrightarrow\quad p(x \mid z) = \prod_{k=1}^{K} \mathcal{N}(x \mid \mu_k, \Sigma_k)^{\,z_k}

これで xx の周辺分布を計算すると、潜在変数を「足して消す(周辺化)」ことで元の GMM が再現されます:

p(x)=zp(z)p(xz)=k=1KπkN(xμk,Σk)p(x) = \sum_{z} p(z)\, p(x \mid z) = \sum_{k=1}^{K} \pi_k\, \mathcal{N}(x \mid \mu_k, \Sigma_k)

要するに:GMM は「まず確率 πk\pi_k でサイコロを振って成分 kk を選び、選んだガウスから xx を1点サンプルする」という二段階の生成過程です。zz はそのサイコロの目で、観測できない(=潜在)。zz を周辺化すると最初の混合密度に戻ります。

graph TB
    Pi["混合係数 π で成分を選ぶ<br/>p(z_k=1)= π_k"] --> Comp["選ばれた成分 k のガウス<br/>N(x | μ_k, Σ_k)"]
    Comp --> X["観測データ点 x を生成"]
    Pi -.->|"z は観測できない潜在変数"| Hidden["どの成分か(サイコロの目)は隠れている"]

完全データ尤度

もし潜在変数 znz_n まで観測できたとすると(=完全データ {xn,zn}\{x_n, z_n\})、その同時尤度は簡単な積の形になります:

p(X,Zθ)=n=1Nk=1K[πkN(xnμk,Σk)]znkp(X, Z \mid \theta) = \prod_{n=1}^{N} \prod_{k=1}^{K} \Big[\pi_k\, \mathcal{N}(x_n \mid \mu_k, \Sigma_k)\Big]^{z_{nk}}

対数を取ると、znkz_{nk} が「選択スイッチ」として効いて、和の対数が消えて対数の和になります:

logp(X,Zθ)=n=1Nk=1Kznk[logπk+logN(xnμk,Σk)]\log p(X, Z \mid \theta) = \sum_{n=1}^{N} \sum_{k=1}^{K} z_{nk}\Big[\log \pi_k + \log \mathcal{N}(x_n \mid \mu_k, \Sigma_k)\Big]

要するにzz さえ分かれば、各点がどの成分のものか確定するので、成分ごとに普通のガウスの最尤推定をするだけ(標本平均・標本共分散を計算するだけ)で済みます。問題は zz が観測できないこと。ここが次節の動機です。

4. なぜ直接の最尤が難しいか:和の対数の壁

潜在変数を周辺化した観測データの対数尤度は、こうなります:

logp(Xθ)=n=1Nlog{k=1KπkN(xnμk,Σk)}\log p(X \mid \theta) = \sum_{n=1}^{N} \log \left\{ \sum_{k=1}^{K} \pi_k\, \mathcal{N}(x_n \mid \mu_k, \Sigma_k) \right\}

完全データ尤度(前節)と見比べてください。log\log の中に k\sum_k が入っているのが致命的です。対数が和の外に出せないので、log\log と指数(ガウス)が打ち消し合ってくれません。

μk\mu_k で微分して 0 と置くと、

μklogp(Xθ)=n=1NπkN(xnμk,Σk)jπjN(xnμj,Σj)これ自身が μ に依存Σk1(xnμk)=0\frac{\partial}{\partial \mu_k} \log p(X\mid\theta) = \sum_{n=1}^{N} \underbrace{\frac{\pi_k\, \mathcal{N}(x_n\mid\mu_k,\Sigma_k)}{\sum_j \pi_j\, \mathcal{N}(x_n\mid\mu_j,\Sigma_j)}}_{\text{これ自身が } \mu \text{ に依存}}\, \Sigma_k^{-1}(x_n - \mu_k) = 0

となり、μk\mu_k の解の中に「μk\mu_k を含む比(後で責任と呼ぶもの)」が入り込んでしまいます。μk\mu_k について解こうとすると右辺にまた μk\mu_k が出てくるので、閉形式で解けません。Σk,πk\Sigma_k, \pi_k も同様です。

graph TB
    Direct["観測データの対数尤度<br/>Σ_n log 「 Σ_k π_k N(...) 」"] -->|"log の中に Σ_k"| Stuck["対数が和を貫通できない"]
    Stuck -->|"∂/∂μ_k = 0 を解くと"| Self["解の中に解自身が現れる<br/>(不動点方程式)"]
    Self -->|"閉形式で解けない"| EM["反復で解く<br/>= EM アルゴリズム"]

要するに:完全データなら一発で解けるのに、潜在変数が見えないせいで「和の対数」が現れ、方程式が**自己参照(不動点)**になってしまう。これを「zz を確率的に補い、補った状態で最尤、を交互に繰り返す」ことで突破するのが EM です。

5. EMアルゴリズム:E-step と M-step

EM(Expectation–Maximization)は、上の不動点方程式を交互更新で解きます。直観はシンプルです:

これを対数尤度が収束するまで繰り返します。

flowchart TB
    Init["初期化:π_k, μ_k, Σ_k を設定<br/>(k-means の結果で初期化することが多い)"] --> Estep
    Estep["【E-step】各点の責任を計算<br/>γ(z_nk)= π_k N(x_n | μ_k, Σ_k) / Σ_j π_j N(x_n | μ_j, Σ_j)"] --> Mstep
    Mstep["【M-step】責任で重み付けして更新<br/>N_k = Σ_n γ(z_nk)<br/>μ_k, Σ_k, π_k を再計算"] --> Eval
    Eval["対数尤度 log p(X | θ)を評価"] --> Check{"収束した ?<br/>(尤度の増分が閾値以下)"}
    Check -->|"No"| Estep
    Check -->|"Yes"| Done["パラメータ確定・各点はソフトに所属"]

E-step:責任 γ(znk)\gamma(z_{nk}) の導出(事後確率=ベイズ)

責任(responsibility)γ(znk)\gamma(z_{nk}) は「点 xnx_n を見たとき、それが成分 kk から生成された事後確率」です。ベイズの定理で素直に出ます:

γ(znk)p(znk=1xn)=p(znk=1)p(xnznk=1)j=1Kp(znj=1)p(xnznj=1)=πkN(xnμk,Σk)j=1KπjN(xnμj,Σj)\gamma(z_{nk}) \equiv p(z_{nk}=1 \mid x_n) = \frac{p(z_{nk}=1)\, p(x_n \mid z_{nk}=1)}{\sum_{j=1}^{K} p(z_{nj}=1)\, p(x_n \mid z_{nj}=1)} = \frac{\pi_k\, \mathcal{N}(x_n \mid \mu_k, \Sigma_k)}{\displaystyle\sum_{j=1}^{K} \pi_j\, \mathcal{N}(x_n \mid \mu_j, \Sigma_j)}

分子は「事前 πk\pi_k × 尤度 N\mathcal{N}」、分母は全成分にわたる正規化(=ちょうど p(xn)p(x_n))です。

要するに:責任は「事前の割合 πk\pi_k と、その成分から xnx_n がどれだけありそうか N\mathcal{N} を掛け、全成分で正規化した割合」です。xnx_n が成分 kk の中心に近く、かつ πk\pi_k が大きいほど責任は大きくなる。γ\gamma[0,1][0,1] で、kk について足すと 1kγ(znk)=1\sum_k \gamma(z_{nk})=1)になります。これが k-means の「最も近い1つに割り当て」を確率に緩めたものです。

なぜ「E-step」と呼ぶか:完全データ対数尤度(第3節)に出てくる znkz_{nk} を、現在のパラメータのもとでの条件付き期待値 E[znkxn]=γ(znk)\mathbb{E}[z_{nk}\mid x_n] = \gamma(z_{nk}) で置き換えているからです。one-hot の期待値はちょうど事後確率になります。EM の一般形ではこの期待値で作る関数 Q(θ,θold)Q(\theta,\theta^{\text{old}})(期待完全データ対数尤度)を最大化します。一般論の詳細は 欠測データ・EMアルゴリズム(統計)へ。

M-step:パラメータ更新の導出(責任で重み付けした最尤)

M-step は、E-step で求めた責任 γ(znk)\gamma(z_{nk})固定した定数とみなして、期待完全データ対数尤度

Q(θ)=n=1Nk=1Kγ(znk)[logπk+logN(xnμk,Σk)]Q(\theta) = \sum_{n=1}^{N} \sum_{k=1}^{K} \gamma(z_{nk}) \Big[\log \pi_k + \log \mathcal{N}(x_n \mid \mu_k, \Sigma_k)\Big]

θ={πk,μk,Σk}\theta=\{\pi_k,\mu_k,\Sigma_k\} について最大化します。γ\gamma が定数なので、今度は和の対数の壁がない(各 log\log が外に出ている)ことに注目してください。ここが EM の妙です。各パラメータについて偏微分して 0 と置きます。

まず便宜のため、成分 kk実効データ数(ソフトな所属数) を定義します:

Nk=n=1Nγ(znk)N_k = \sum_{n=1}^{N} \gamma(z_{nk})

平均 μk\mu_klogN\log\mathcal{N}μk\mu_k 微分は Σk1(xnμk)\Sigma_k^{-1}(x_n-\mu_k) なので、

Qμk=nγ(znk)Σk1(xnμk)=0          μk=1Nkn=1Nγ(znk)xn  \frac{\partial Q}{\partial \mu_k} = \sum_{n} \gamma(z_{nk})\, \Sigma_k^{-1}(x_n - \mu_k) = 0 \;\;\Longrightarrow\;\; \boxed{\;\mu_k = \frac{1}{N_k} \sum_{n=1}^{N} \gamma(z_{nk})\, x_n\;}

要するに:新しい平均は「責任で重み付けしたデータの平均」。k-means が「割り当てられた点の単純平均」だったのが、重みが 0/1 から [0,1][0,1] の連続値に変わっただけです。

共分散 Σk\Sigma_klogN\log\mathcal{N}Σk\Sigma_k(あるいは精度行列 Σk1\Sigma_k^{-1})で微分して 0 と置くと、標本共分散の重み付き版が出ます:

  Σk=1Nkn=1Nγ(znk)(xnμk)(xnμk)  \boxed{\;\Sigma_k = \frac{1}{N_k} \sum_{n=1}^{N} \gamma(z_{nk})\, (x_n - \mu_k)(x_n - \mu_k)^{\top}\;}

要するに:各点の外積 (xnμk)(xnμk)(x_n-\mu_k)(x_n-\mu_k)^\top を責任で重み付けして平均したもの。これも k-means にはない「クラスタの広がり・向き」を担う部分です。

混合係数 πk\pi_kπk\pi_k には kπk=1\sum_k \pi_k = 1 という制約があるので、ラグランジュ未定乗数 λ\lambda を導入して

Q+λ(k=1Kπk1)Q + \lambda \Big(\sum_{k=1}^{K} \pi_k - 1\Big)

πk\pi_k で微分します。QQπk\pi_k 依存部分は nγ(znk)logπk=Nklogπk\sum_n \gamma(z_{nk})\log\pi_k = N_k\log\pi_k なので、

πk[Nklogπk+λπk]=Nkπk+λ=0        πk=Nkλ\frac{\partial}{\partial \pi_k}\Big[N_k \log\pi_k + \lambda \pi_k\Big] = \frac{N_k}{\pi_k} + \lambda = 0 \;\;\Longrightarrow\;\; \pi_k = -\frac{N_k}{\lambda}

両辺を kk で足し、kπk=1\sum_k \pi_k = 1kNk=N\sum_k N_k = N を使うと λ=N-\lambda = N、よって

  πk=NkN  \boxed{\;\pi_k = \frac{N_k}{N}\;}

要するに:新しい混合係数は「成分 kk のソフトな所属数を全体で割った割合」。ラグランジュ乗数は「総和1」という確率の制約を効かせるために必要で、解いてみると λ=N\lambda=-N という綺麗な値になります。

パラメータ更新式k-means での対応
平均 μk\mu_k1Nknγ(znk)xn\dfrac{1}{N_k}\sum_n \gamma(z_{nk})\,x_nクラスタ重心(割り当て点の平均)
共分散 Σk\Sigma_k1Nknγ(znk)(xnμk)(xnμk)\dfrac{1}{N_k}\sum_n \gamma(z_{nk})(x_n-\mu_k)(x_n-\mu_k)^\top(なし。k-means は Σ=εI\Sigma=\varepsilon I 固定)
混合係数 πk\pi_kNkN\dfrac{N_k}{N}(なし。等重みと等価)

EM は対数尤度を単調増加させる(収束)

EM の最も重要な性質は、E→M の1サイクルごとに観測データの対数尤度 logp(Xθ)\log p(X\mid\theta) が必ず増加(少なくとも非減少)することです:

logp(Xθ(t+1))    logp(Xθ(t))\log p(X \mid \theta^{(t+1)}) \;\ge\; \log p(X \mid \theta^{(t)})

直観はこうです。EM は対数尤度そのものを直接上げる代わりに、下界(ELBO)を構成して、E-step でその下界を現在の点で対数尤度に接するよう持ち上げ、M-step で下界を最大化する、という二段で動きます。下界を上げれば、それを上回る本物の対数尤度も必ず上がる、という仕組みです。

この「下界が単調に上がるから本体も上がる」という一般論の完全証明(ELBO の構成・Jensen の不等式・KL 項が消えること)は 欠測データ・EMアルゴリズム(統計)に譲ります。本ノートでは「GMM の E/M 更新が、その一般論の具体例になっている」と理解すれば十分です。

⚠️ 注意:単調増加が保証するのは局所最適への収束だけです。GMM の対数尤度は多峰(複数の山)なので、初期値次第で別の局所解に落ちます。だから複数の初期値で回して最良を選ぶ、k-means で初期化する、といった工夫が要ります。

6. k-means との関係:Σk=εI\Sigma_k=\varepsilon Iε0\varepsilon\to 0

GMM が k-means の一般化であることを、数式で確かめます。すべての成分の共分散を 共通の等方行列 Σk=εI\Sigma_k=\varepsilon I に固定し(πk\pi_k も等しいとする)、ε\varepsilon を 0 に近づけます。

ガウスの指数部だけ見ると、N(xnμk,εI)exp ⁣(12εxnμk2)\mathcal{N}(x_n\mid\mu_k,\varepsilon I) \propto \exp\!\big(-\tfrac{1}{2\varepsilon}\|x_n-\mu_k\|^2\big) です。これを責任の式に代入すると、

γ(znk)=exp ⁣(xnμk2/2ε)jexp ⁣(xnμj2/2ε)\gamma(z_{nk}) = \frac{\exp\!\big(-\|x_n-\mu_k\|^2 / 2\varepsilon\big)}{\sum_j \exp\!\big(-\|x_n-\mu_j\|^2 / 2\varepsilon\big)}

これは 温度 ε\varepsilon の softmax です。ε0\varepsilon\to 0(温度を下げる)と、分母は最も近い中心xnμk\|x_n-\mu_k\| が最小の kk)の項だけが指数的に支配的になり、

γ(znk){1k=argminjxnμj2 (最も近い中心)0それ以外\gamma(z_{nk}) \longrightarrow \begin{cases} 1 & k = \arg\min_j \|x_n - \mu_j\|^2 \ (\text{最も近い中心}) \\ 0 & \text{それ以外} \end{cases}

責任が 0/1 にスナップします。これはまさに k-means の「最も近い重心へ硬く割り当て」です。すると M-step の μk\mu_k 更新は責任が 0/1 なので「割り当てられた点の単純平均」になり、Lloyd 法の重心更新に一致します。

graph TB
    GMM["GMM + EM<br/>責任 γ は 0〜1 の連続値(ソフト)"] -->|"Σ_k = εI に固定"| Iso["等方・共通分散に制約"]
    Iso -->|"ε → 0(温度を下げる)"| Hard["責任が 0/1 にスナップ<br/>= 最近傍への硬い割り当て"]
    Hard -->|"M-step が単純平均に"| Lloyd["k-means(Lloyd 法)"]

要するに:k-means は「GMM を等方・等分散・ゼロ温度に絞った極限」です。E-step が「最近傍割り当て」、M-step が「重心更新」に化けます。逆に言えば GMM は、k-means に「楕円の形(Σk\Sigma_k)・成分の重み(πk\pi_k)・確率的所属(有限の ε\varepsilon)」を解放した一般化です。ε\varepsilon は統計力学でいう温度で、EM はその意味で k-means の「焼きなまし版」とも読めます。

7. 共分散の型と自由度

各成分が持つ共分散 Σk\Sigma_k をどこまで自由にするかで、表現力とパラメータ数(過学習しやすさ)が変わります。実務ではこの「型」を選ぶのが重要なチューニングです。

共分散の型Σk\Sigma_k の形クラスタの形1成分あたりの共分散パラメータ数(dd 次元)
球状(spherical)σk2I\sigma_k^2 I等方の球11
対角(diagonal)diag(σk12,,σkd2)\mathrm{diag}(\sigma_{k1}^2,\dots,\sigma_{kd}^2)軸に平行な楕円dd
フル(full)任意の対称正定値行列任意の向きの楕円d(d+1)/2d(d+1)/2
共有(tied)全成分で同じ Σ\Sigma同じ形の楕円が並ぶd(d+1)/2d(d+1)/2(全体で1つ)

要するに:球状 → 対角 → フル の順に表現力が上がりますが、パラメータ数も増えて過学習・特異点のリスクが上がります。データが少ない・次元が高いときは対角や球状に落とすのが安全。フルは向きの傾いた楕円まで表せる代わりに O(d2)O(d^2) のパラメータを抱えます。

なお、GMM 全体の自由パラメータ数は次節のモデル選択で使うので押さえておきます(フル共分散・KK 成分・dd 次元の場合):

p=(K1)πk(総和1の制約)+Kdμk+Kd(d+1)2Σkp = \underbrace{(K-1)}_{\pi_k\,(\text{総和1の制約})} + \underbrace{K d}_{\mu_k} + \underbrace{K\,\frac{d(d+1)}{2}}_{\Sigma_k}

8. 特異点問題:尤度が無限大に発散する病理

GMM の最尤推定には深刻な病理があります。フル(または対角)共分散を許すと、対数尤度が上に有界でなく、無限大に発散しうるのです。

シナリオはこうです。ある成分 kk の平均 μk\mu_k が、たまたま1つのデータ点 xnx_nぴったり一致したとします(μk=xn\mu_k=x_n)。このとき、その成分の共分散を Σk=σk2I\Sigma_k=\sigma_k^2 I として σk0\sigma_k\to 0 に縮めると、その点での密度は

N(xnxn,σk2I)=1(2π)d/2σkd    σk0    \mathcal{N}(x_n \mid x_n, \sigma_k^2 I) = \frac{1}{(2\pi)^{d/2}\,\sigma_k^{d}} \;\xrightarrow{\;\sigma_k\to 0\;}\; \infty

と発散します(正規化定数の 1/σkd1/\sigma_k^d が爆発)。つまり1つの成分が1点に潰れて、その点に無限の確率密度を載せると、対数尤度がいくらでも大きくなってしまう。これが特異点(singularity)問題です。

graph TB
    Sing["ある成分が1点に潰れる<br/>μ_k = x_n, σ_k → 0"] -->|"密度 1/σ_k^d → ∞"| Div["その点の尤度が発散"]
    Div -->|"対数尤度が上に有界でない"| Bad["最尤解が壊れる<br/>(意味のない退化解)"]
    Bad --> Fix["対処:共分散に下限・正則化・<br/>事前分布(MAP/ベイズ)・型の制約"]

要するに:最尤を素朴に追うと、「クラスタ」ではなく「1点に張り付いた針のような成分」へ逃げる退化解が存在します。k-means にはこの病理がありません(Σ\Sigma を持たないので密度が発散しない)。GMM 特有の落とし穴です。

主な対処

9. モデル選択:成分数 KK をどう決めるか

KK(成分数)はデータからは自動で決まりません。KK を増やすほど対数尤度は単調に上がる(複雑なモデルほどデータに合う)ので、対数尤度だけで KK を選ぶと際限なく増えてしまう。そこで「適合度」と「複雑さの罰則」をバランスさせる情報量規準を使います。

AIC=2p2,BIC=plnN2\mathrm{AIC} = 2p - 2\ell, \qquad \mathrm{BIC} = p\ln N - 2\ell

ここで =logp(Xθ^)\ell = \log p(X\mid\hat\theta) は最尤での対数尤度、pp は自由パラメータ数(第7節の式)、NN はサンプル数です。どちらも小さいほど良いモデルです。候補 K=1,2,3,K=1,2,3,\dots(と共分散の型)で GMM を当てはめ、AIC/BIC が最小の組み合わせを選びます。

要するに:第1項 2-2\ell は「データへの当てはまり(小さいほど良い)」、第2項は「パラメータ数のペナルティ」。KK を増やすと \ell は上がる(第1項は下がる)が、pp も増える(第2項は上がる)。両者が釣り合う KK が選ばれます。

xychart-beta
    title "成分数 K と情報量規準(概念図・BIC が最小の K を選ぶ)"
    x-axis "成分数 K" [1, 2, 3, 4, 5, 6]
    y-axis "BIC(小さいほど良い)" 0 --> 100
    line "BIC" [90, 55, 35, 38, 48, 62]

⚠️ よくある誤解・落とし穴

対応するシミュレーション

simulations/gmm_em.py:2つのガウス分布から生成したデータに EM を自前実装で適用します。E ステップ(責任の計算)と M ステップ(π,μ,Σ\pi,\mu,\Sigma の更新)を繰り返すと、対数尤度が反復のたびに単調増加して収束する様子と、各点が確率的に(ソフトに)クラスタへ割り当てられる様子(境界付近の点ほど中間色になる)を可視化します。

EM で対数尤度が単調増加・各点のソフトな割り当て

関連ノート