PCAとkmeansを組み合わせた分析

いままで知らなかったのだが、常套手段らしい。

どういう時に役にたつか?

大目的

あるデータがあって、そのデータをクラスタリングしたい。(つまり、データをkmeasnで分離したい。)

問題どころ

データの状況によっては、実数空間のままではうまく分離ができないことがある。

つまり、データの性質から望ましくない分離がなされてしまう(であろうとすでにわかっている)

どう解決するか?

あらかじめ、別の空間に射影しておき、その空間でクラスターに分離してしまえばよい。

つまり、PCAで新しい軸ではられる空間に射影しておき、その空間上でkmeansクラスタリングを行うのだ。

ちょっとした言い訳

自分はいままでPCAと言えば、「次元圧縮をするもの」と理解していたので、この使い方がはじめは理解できなかった。

でも、このページの主成分分析でも解説されているように、PCAには「データの特徴を表す新しい指標を見つける」という使い方がある。

そもそも、「次元を圧縮する」のも「新しい指標を見つける」のも、別の空間に射影しているからできることである。

PCAとは「別の空間に射影している」と理解できていれば、 PCA + kmeans の使い方も理解が早かっただろう。

(ちなみに計算的には入力行列の固有値問題を解いて、固有ベクトルを新しい軸にしている)

どう実装するか??

pythonだとscikit-learnでPCAもk-meansも実現できる。

PCAクラスの使い方は こういうページこういうページが、わかりやすい実装例を公開しているので、参考になる。

k-meansの使い方は

この実装例がとてもわかりやすいと思う。

ちなみに公式マニュアルのkmeansクラスの使い方はここを参考にするとよさそう。

気をつける(方がよさそうな)ところ

入力データの正規化をしておこう

この話に限らず、機会学習系の話は正規化しておくと、きちんとした結果になるのはあるあるである。

scikit-learnには便利なことに正規化のためのクラスが用意されているので、活用できる。

今回はscaleをした。

各データに対して、平均と分散から標準偏差に変換してくれる(ん?あってるか?)

行列が目的にあった配置になっているか気を配ろう

今回、実装しているときも何度かつまずいたのだが、行列を転置しなくてはいけないケースが何度かある。

必ずクラスの出力を確認して、望ましい形になっているか?確認しないといけない。

行列.shapeの属性を呼び出すと、タブルで行数と列数を返してくれるので、こまめにチェックすべきだろう。

と、いうわけで(何かやねん)、作成したコードとテスト用のinputはGistに公開してます。