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に公開してます。