オートエンコーダー(AE)とクラスタリングの実装

4、8、16次元の任意の特徴を持つベクトルのデータセットを作ります。それらをオートエンコーダーで2次元ベクトルに変換して、クラスタリングすることを目的とします。ラベリングはわかっているので、最後にこれらを並べて描画して、精度を確認します。

 

オートエンコーダー(AE)とは自分自身を教師データとしてニューラルネットワークを学習することで、特徴を抽出する手法のことです。今回はこれで次元圧縮を行います。

 

AEとChainerについては以下の本を参考にしました。

shop.ohmsha.co.jp

 

 

1:学習するデータを作る

2:オートエンコーダーで学習して2次元ベクトルにする

3:クラスタリングする

4:ラベリングと比較して、精度を確認する

 

この流れで説明します。

 

作成したプログラムは全てgithubに上げてあります。

github.com

 

 

          1:学習するデータを作る

 

1から10の数字がランダムに入った8、16次元ベクトルを作ります。8次元ベクトルは2つずつ、16次元ベクトルは4つずつ、マイナスにします。こうすることで、それぞれ4クラスずつ、データを作ります。

 data_create.pyです。

 

          2:オートエンコーダーで学習して2次元ベクトルにする

 

train3.pyでは8次元ベクトルをオートエンコーダーで2次元ベクトルに変換して、ラベリングはわかっているので、クラスごとに色付けて、グラフに描画しました。

train4.pyでは16次元ベクトルを2次元です。後は同様です。

train5.pyでは16次元ベクトルを6次元にして、その6次元ベクトルを、2次元にします。後は同様です。

train3.py、train4.py、train5.pyです。 

描画結果は4で示します。

 

          3:クラスタリングする

 

ラベリングはわかっていないものとしてtrain5.pyで変換された2次元ベクトルにクラスタリングを行います。 

 

クラスタリングするために、sklearnをインポートします。

使うアルゴリズムはkmeansです。この手法はあらかじめクラスタ数がわかっている必要があります。最初にクラスタ数分の中心点をランダムに設定します。その中心点から各点の距離を考えて、それぞれの点をクラスタに分類します。その後、それぞれのクラスタの重心を求め、その位置で中心点を更新します。これを繰り返します。これがkmeansです。

 

機械学習の手法については別記事でまとめてあります。

person.hatenablog.jp

 

scikitlearnでkmeansを使う方法について、以下の記事を参考にしました。

 

1: scikit-learn でクラスタ分析 (K-means 法) – Python でデータサイエンス

2: paiza.hatenablog.com

 

作成したプログラムはcluster.py です。

最後はクラスタごとに色を付けて、グラフに描画しています。

 

 

          4:ラベリングと比較して精度を確認する

 

 

f:id:wada0421514:20180406211505p:plain

 

8次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがほとんどうまくいっていることがわかります。(train3.py)

 

 

f:id:wada0421514:20180406211914p:plain

 

16次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがかなりうまくいっていることがわかります。(train4.py)

 

f:id:wada0421514:20180406212437p:plain

 

16次元ベクトルをAEで6次元に変換して、それを2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。色とマーカーが対応してないです。すいません。AEによるデータ圧縮があんまりうまくいっていない感じです。直感的に、間に6次元を挟んであげることで、特徴をとらえやすくなるかと考えましたが、ダメでした。(train5.py)

 

 以上、AEとクラスタリングでした。AEは思った以上に圧縮がうまくいっていたので良かったです。クラスタリングをするのにsklearnを使いましたが、思った以上に使いやすく、驚きました。

 

アドバイス、改善点、質問があればお願いします。