人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

統計的声質変換 (5) scikit-learnのGMMの使い方

統計的声質変換 (4) パラレルデータの作成(2015/3/10)の続き。

今回は、いよいよ声質変換モデルを混合ガウスモデルで学習しよう!と思ったのだけれど、その前にscikit-learnGMMライブラリの使い方を簡単にまとめることにした。本格的に使う前に簡単なデータで使い方を確認しておこうというのが趣旨。scikit-learnは最近使い始めたので使ったことがない機能がまだたくさんある。

混合ガウスモデル(GMM)

GMMは、データxの生成される確率を複数のガウス分布の重み付き和で表すモデルである。

\displaystyle p(x) = \sum_{k=1}^K \pi_k N(x|\mu_k, \Sigma_k)

ここで、Kは使用するガウス分布の個数、\pi_kはk番目のガウス分布の重み(混合係数)、\mu_kは、k番目のガウス分布の平均ベクトル、\Sigma_kは、k番目のガウス分布の共分散行列。混合係数はすべてのkについて足し合わせると1になる。

GMMの学習は、データセットXを用いて、尤度がもっとも高くなる混合係数と平均ベクトルと共分散行列を推定することを指す。GMMでは、混合係数と平均ベクトルと共分散行列がパラメータに当たる。一方、ガウス分布の個数Kは自分で決め打ちする必要がある(これも推定する方法あるのかな?)。

で、その最尤推定は、GMMの場合、解析的に解けないのでEMアルゴリズムという繰り返し最適化手法を使いましょうという流れになる。以前、PRMLの勉強(2010/8/29)をしていたときに混合ガウスモデルの学習をEMアルゴリズムで解く記事を書いたことがあった。

今回は、自分で書いたアルゴリズムではなく、scikit-learnの混合ガウスモデルを学習するライブラリを使って同じ結果になるか確認してみたい。

PRMLのサンプルデータ

今回は、PRMLでも使われていたfaithful.txtのデータを使って確認しよう。まず、可視化する。

f:id:aidiary:20150322211032p:plain

散布図を書いてみるとデータは2つの山にわかれていることがわかる。ガウス分布が2つあればうまくモデル化できそうなのでK=2としてGMMを学習する。

scikit-learnの大部分のアルゴリズムでは、訓練データ X_train は行方向にサンプル、列方向に特徴量が並んだ行列形式で表される。n_componentsはガウス分布の個数Kのこと。次に、gmmオブジェクトを生成し、fit()に学習データを与えるだけでパラメータ推定できる。推定したパラメータは、gmmオブジェクトに格納されている。混合係数はweights_、平均ベクトルはmeans_、共分散行列はcovars_に格納される。

*** weights
[ 0.64402184 0.35597816]

*** means
[[ 0.70404975 0.66866654]
[-1.27373939 -1.20972547]]

*** covars
[[[ 0.13173538 0.06060868]
 [ 0.06060868 0.19652982]]

[[ 0.05445178 0.02829092]
 [ 0.02829092 0.18407749]]]

出力されたグラフはこれ。

f:id:aidiary:20150322211029p:plain

平均ベクトルと共分散行列はデータに重なり、きちんと推定できていることがわかる。前に自分で実装した結果とも同じになった。やったね!

次回は、いよいよパラレルデータを使って声質変換モデルをGMMで学習してみよう。