趣旨
前回紹介したEMアルゴリズムを用いて超有名なグラフ混合分布(GMM)を解く。煩雑な計算については極力述べず、統計的な観点から重要な点だけおさえる。
なんで今更?
うるさいなぁ理解を深めるため。
では解説する。
表記法
1. 入力とハイパーパラメタ
- : 入力次元数
- : 入力データの数
- : 重ね合わせるガウス分布の数 未知だが推定不可なので決め打ちする(ハイパーパラメタ)
- : 総入力
2. モデルパラメタ
- : モデルパラメタその1 各ガウス分布の混合係数
- : モデルパラメタその2 各ガウス分布の平均
- : モデルパラメタその3 各ガウス分布の分散共分散行列
- : 上の3つのモデルパラメタを総称したもの。分けて書く必要性が特にない時はこっちを使う。
3. 潜在変数
- : 潜在変数 対応するがどのガウス分布に所属するかを示す(後述)
問題設定
以下のようなガウス分布の線形重ね合わせを考える。
ただし、。これを最大にするようなモデルパラメタを求めたい。
解法
Eステップ
負担率を計算する。
期待値の式は省略。
Mステップ
さっき省略した期待値を最大にするようにパラメタを更新する。ここでを以下のように定義する。
これを用いて、
なんでそうなるの?
EMアルゴリズムについては前の記事を参照のこと。
Eステップ
EMアルゴリズムによれば、Eステップでは期待値の計算を行う。
さて、潜在変数を導入し、まず、次にを求めよう。
1. 潜在変数の導入
潜在変数をがどのガウス分布に所属するかを示すOne-hotベクトルとして定義する。つまり、
そして、を各について並べたものをとする。
2. の計算
より、が番目のガウス分布に所属する確率はと書ける。よって、
一方、を用いることで、以下のような関係性も成り立つ。
以上より、について
と書ける。
3. の計算
ベイズの定理より、
と書ける。ややこしくなってきたが大丈夫。
4. 期待値の計算
以上の計算を踏まえ、いよいよ、すなわち期待値の計算に移ろう。
ここで負担率について
と定義すれば、
と多少は簡素に書ける。
4. って具体的にはいくらなの?
さて、前で示したような悍ましい式をに入れても良いのだが、その前にある重要な性質を確認しておく: は統計的に独立している。つまり今回期待値を取りたいのはなので、におけるなどは考慮しなくても良いのである。よって先ほどの期待値は
と簡単化される(ここで、分母分子のインデックスをと区別するためとした)。いやまだ簡単ではないだろと思うかもしれない。ここでさらにもう一つトリックを入れる: はOne-hotベクトルである。つまりの取りうる値はしかない。の時はの中身もになるのだから、のときだけ考えれば良い。この時を満たすについてとなることにも注意しよう。
が成立する。なおこの負担率が何を意味するのかは触れない。ヨソ行け。
Mステップ
Mステップでは、Eステップで定義した期待値:
を、 (つまり、、、)について最大化する。偏微分の計算は面白くないので めんどくさいので もう疲れたので今ここで述べたい要旨からずれるので省略。計算的にはしんどいけど発想的にはそこまでしんどくないので多分大丈夫。なんなら他サイトあるし。しかし1点、拘束条件:にだけ注意。これの最適化はLagrangeの未定乗数法を用いる。
まとめ
EMアルゴリズムをGMMに適用するという情報学徒なら1度はやることを改めて勉強しなおした。Pythonの実行コードもあるので(そんなものいくらでもありそうだが)参考にどうぞ。
おまけ
K*gglerの皆さんは理論なんてどうでもいいだろうね、だってこれでいいし。
import numpy as np from sklearn.mixture import GaussianMixture model = GaussianMixture(n_components=2) model.fit(X)