sklearnで高次元の入力データをシンプルにSVNとPCAしてグラフにプロット
で64次元から2次元にデータを次元圧縮して表示したけど、このままだと結局どのようにSVMが決定境界を持っているかいまいちわからない.
かといって64次元空間で引かれている決定境界なんて2次元境界に可視化できない.
完全ではないけどひとまずそれっぽいもの
とりあえず圧縮された次元から決定境界を求めてみる.
1.プロットのx,y座標をPCAの逆変換で64次元に変換
2.変換後の64次元データでSVMのClfに突っ込む.
3.結果を元にプロットで可視化
64次元の2次元で60%の寄与率だったのもあってかそこそこ引けているように見える.実際には他62次元分を考慮していないので正確ではないのはしょうがない.今回のデータではうまくいっているように見える.
contourfではSVMのdecision_functionの結果(マージン)を入れているのである程度連続値として出ている.
まずコード
そんで結果
がんばって境界面の点から境界面表示
どうにかする方法がないかを探していたら、頑張って表示しようとしている人を見つけた.
https://github.com/tmadl/highdimensional-decision-boundary-plot
まだ検証中のようなので完全とは言えないそうだが、絵だけ見るとそこそこできそうな感じ.
ここではこれを紹介する.
ベースの考え方
githubのREADMEは以下のように試みていることが書かれている.
- 二つのクラスからの間を結び、決定境界のキーポイントを探す.
- 見つけた決定境界のキーポイントを結んでいく.
- もし決定境界の交わりが泣けrば、超球面上にどちらとも言えない領域を探す.(?正しい?)
- 見つけたキーポイントや境界をPCAやLDAなどの次元圧縮でプロットする.
なんかできそう.
使う
実際に使って実行するには、Nloptというのが必要なのでインストールする.pythonで行う場合はさらにSWIGも必要に見える.
Nloptのインストールは以下
https://nlopt.readthedocs.io/en/latest/NLopt_Installation/
SWIGは以下
http://www.swig.org/
最後に
https://github.com/tmadl/highdimensional-decision-boundary-plot/blob/master/decisionboundaryplot.py
のファイルを以下のPythonファイルと同じディレクトリにおく.
そしたらコードを実行.