混合ガウスモデルと最尤推定法

はじめに

今回は、混合ガウスモデルと、そのパラメータを求める際に使われる最尤推定法についてまとめる。そのあと、OpenCVを用いたコード例を示す。

混合ガウスモデル

ある確率分布p(\vec{x})が与えられとき、これをガウス関数の線形結合で近似することを考える。

(1)    \begin{equation*} p(\vec{x})=\sum_{k=1}^{K} \pi_{k}\;{\cal N}\left(\vec{x} | \vec{\mu}_{k}, \Sigma_{k}\right) \end{equation*}

ここで、{\cal N}\left(\vec{x} | \vec{\mu}_{k}, \Sigma_{k}\right)は、平均値\vec{\mu}_k、共分散\Sigma_{k}を持つガウス関数(正規分布)である。\pi_{k}は各ガウス関数の重みを表す。このように、任意の分布をガウス関数の線形結合で近似することを混合ガウスモデルと呼ぶ。上式の両辺を\vec{x}で積分すると次式を得る。

(2)    \begin{equation*} \sum_{k=1}^{K}\;\pi_k=1 \end{equation*}

ここで、ガウス関数は規格化されていることを用いた。この式は\pi_kに課せられる拘束条件である。

いま、観測点の集合(\vec{x}_1,\cdots,\vec{x}_N)を考える。これらが同時に実現する確率p(\vec{x}_1,\cdots,\vec{x}_N)は、独立同一分布を仮定すれば、以下のように書くことができる。

(3)    \begin{equation*} p(\vec{x}_1,\cdots,\vec{x}_N)=\prod_{n=1}^{N}p(\vec{x}_n) \end{equation*}

式(1)を代入すると

(4)    \begin{equation*} p(\vec{x}_1,\cdots,\vec{x}_N)=\prod_{n=1}^{N}\sum_{k=1}^{K} \pi_{k}\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right) \end{equation*}

を得る。右辺に存在する全パラメータ(\pi_k,\vec{\mu}_k,\Sigma_k),k=1,\cdots,Kを決定し、出来るだけ正確に左辺値(観測結果)を再現することを考える。つまり、どのパラメータを選べば観測値を尤もらしく再現できるかという問題を考えることになる。この文脈に於いて、式(3)は尤度と呼ばれる。

最尤推定法

「観測値を尤もらしく再現する」とは、同時確率分布を最大にすることである。ただし、計算の便宜上、次の尤度の対数(対数尤度)を最大化する。

(5)    \begin{equation*} \ln{p(\vec{x}_1,\cdots,\vec{x}_N)}=\sum_{n=1}^{N}\ln{\left\{\sum_{k=1}^{K} \pi_{k}\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right)\right\}} \end{equation*}

(対数)尤度を最大化することでパラメータを決定する手法を最尤推定法と呼ぶ。拘束条件(2)をLagrange乗数\lambdaを用いて取り込んだ次式を最大化する。

(6)    \begin{equation*} J=\sum_{n=1}^{N}\ln{\left\{\sum_{k=1}^{K} \pi_{k}\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right)\right\}}+\lambda\left(\sum_{k=1}^{K}\;\pi_k-1\right) \end{equation*}

Jを各パラメータで偏微分し、それぞれを0と置けば良い。\vec{\mu}_kによる偏微分から次式を得る。

(7)    \begin{equation*} \vec{\mu}_k=\frac{1}{N_k}\;\sum_{n=1}^{N}\;\gamma_{n,k}\;\vec{x}_n \end{equation*}

ここで、

(8)    \begin{eqnarray*} \gamma_{n,k}&=& \frac{\pi_k\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right)}{\sum_{j=1}^K\pi_j\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{j}, \Sigma_{j}\right)} \\ N_k &=& \sum_{n=1}^{N}\;\gamma_{n,k} \end{eqnarray*}

とした。\Sigma_kによる偏微分から次式を得る。

(9)    \begin{equation*} \Sigma_k = \frac{1}{N_k}\;\sum_{n=1}^{N}\;\gamma_{n,k}(\vec{x}_n-\vec{\mu}_k)(\vec{x}_n-\vec{\mu}_k)^T \end{equation*}

ここでTは転置を表す。最後に、\pi_kによる偏微分から

(10)    \begin{equation*} \pi_k=\frac{N_k}{N} \end{equation*}

を得る。パラメータ(\vec{\mu}_k, \Sigma_k, \pi_k)が、全て\gamma_{n,k}で表されていることに注意する。つまり、\gamma_{n,k}が求まれば、(\vec{\mu}_k, \Sigma_k, \pi_k)は全て求まる。しかし、\gamma_{n,k}を求めるには、(\vec{\mu}_k, \Sigma_k, \pi_k)が決まらなければならない。これを解く1つの手法が以下に示す反復法である。

  1. \vec{\mu}_k, \Sigma_k, \pi_kを適当な値で初期化する。
  2. \gamma_{n,k}を計算する。
  3. \gamma_{n,k}を用いて、\vec{\mu}_k, \Sigma_k, \pi_kを計算する。
  4. \vec{\mu}_k, \Sigma_k, \pi_kを用いて、式(5)を計算する。
  5. \vec{\mu}_k, \Sigma_k, \pi_kが収束するまで、あるいは、式(5)が収束するまで、手順2から4までを繰り返す。

手順1に於いて、\vec{\mu}_kの初期値を求める際、K-meansクラスタリングがしばしば用いられる。K個のクラスタの中心座標を、\vec{\mu}_kと見なせば良い。

ところで、\gamma_{n,k}は次式で与えられた。

(11)    \begin{equation*} \gamma_{n,k}&=& \frac{\pi_k\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right)}{\sum_{j=1}^K\pi_j\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{j}, \Sigma_{j}\right)} \end{equation*}

この式は、点\vec{x}_nが与えられたとき、その点がどのガウス関数に属しているかを表す事後確率p(k|\vec{x}_n)を表す。両辺をkで和を取ると、次式が成り立つことに注意する。

(12)    \begin{equation*} \sum_{k=1}^{K}\;\gamma_{n,k}=1 \end{equation*}

詳細は省くが、上に示した反復法は、混合ガウスモデルにEMアルゴリズムと呼ばれる手法を適用した場合の手順と、厳密に等価であることが示される。

実装

混合ガウスモデルにEMアルゴリズムを適用するプログラムを以下に示す。言語はC++、ライブラリはOpenCVである。対象はRGB画像である。画像上の各画素値(3次元ベクトル)が観測値に相当する。すなわち、\vec{x}_n=(r,g,b)である。Nは全画素数である。RGB空間に存在する観測点の分布を混合ガウスモデルで再現しようとする試みである。最初に全プログラムを示す。

  1. macOS Sierra
  2. Xcode Version 9.2(C++ Language Dialect: C++17)
  3. OpenCV-3.2.0
  4. boost-1.65.1

各処理と理論式とを対応づける。

上記は

(13)    \begin{equation*} \sum_{k=1}^K\;\gamma_{n,k}=1 \end{equation*}

を確認している。

上記は

(14)    \begin{equation*} \sum_{k=1}^K\;\pi_k=1 \end{equation*}

を確認している。また、log_likelihoodsは

(15)    \begin{equation*} \ln{\sum_{k=1}^{K} \pi_{k}\;{\cal N}\left(\vec{x}_{n} | \vec{\mu}_{k}, \Sigma_{k}\right)} \end{equation*}

に対応し、labelsは

(16)    \begin{equation*} \newcommand{\argmax}{\mathop{\rm arg~max}\limits} \argmax_{k}\gamma_{n,k} \end{equation*}

に対応し、meansは\vec{\mu}_kに対応する。

結果

次のコマンドで実行する。実行ファイルに続けて画像パスを入力する。

計算結果を以下に示す。Kは考慮するガウス関数の数である。

RGB空間内の色の分布p(\vec{x})を混合ガウスモデルで近似し、各画素の色を、labelsに対応するガウス関数の平均値\vec{\mu}_kに置き換えたものである。

まとめ

色分布を適当なグループに分離し、各画素をそのグループを代表する色で置き換えるという手順は、先に説明したK-meansクラスタリングと同じである。どちらが優れているかという議論は一概にはできない。ただし、今回の方が手順が複雑な分、計算時間は長いことだけを指摘しておく。
今回説明した反復法は、EMアルゴリズムの具体例である。一般的なEMアルゴリズムの説明は、例えば「Pattern Recognition and Machine Learning」を参照されたい。
本プログラムは2013年に書いたものをベースとした。今回再録するにあたり、OpenCVのインターフェース、C++のインタフェースを大幅に書き換えた。

Kumada Seiya

Kumada Seiya

仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP