4、8、16次元の任意の特徴を持つベクトルのデータセットを作ります。それらをオートエンコーダーで2次元ベクトルに変換して、クラスタリングすることを目的とします。ラベリングはわかっているので、最後にこれらを並べて描画して、精度を確認します。
オートエンコーダー(AE)とは自分自身を教師データとしてニューラルネットワークを学習することで、特徴を抽出する手法のことです。今回はこれで次元圧縮を行います。
AEとChainerについては以下の本を参考にしました。
この流れで説明します。
作成したプログラムは全てgithubに上げてあります。
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です。
機械学習の手法については別記事でまとめてあります。
scikitlearnでkmeansを使う方法について、以下の記事を参考にしました。
1: scikit-learn でクラスタ分析 (K-means 法) – Python でデータサイエンス
作成したプログラムはcluster.py です。
最後はクラスタごとに色を付けて、グラフに描画しています。
8次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがほとんどうまくいっていることがわかります。(train3.py)
16次元ベクトルをAEで2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。クラスタリングがかなりうまくいっていることがわかります。(train4.py)
16次元ベクトルをAEで6次元に変換して、それを2次元に変換したやつです。左がラベリングで、右がクラスタリングの結果です。色とマーカーが対応してないです。すいません。AEによるデータ圧縮があんまりうまくいっていない感じです。直感的に、間に6次元を挟んであげることで、特徴をとらえやすくなるかと考えましたが、ダメでした。(train5.py)
以上、AEとクラスタリングでした。AEは思った以上に圧縮がうまくいっていたので良かったです。クラスタリングをするのにsklearnを使いましたが、思った以上に使いやすく、驚きました。
アドバイス、改善点、質問があればお願いします。