matplotlibで結果表示上にデータの画像も重ねて表示する(python)
上記のような可視化をするときには入力データを2次元のデータを使って可視化をした.
でも実際は2次元のデータを識別するようなタスクはあまりなくてもっと大きな次元での入力データを扱ったタスクが多い.SVNした結果を表示できないと感覚もつかみにくい.今回は高次元データを入力に表示するときのコードをめもっておく.
高次元データの二次元表示
3次元までならなんとか可視化できるけど、それ以上は通常可視化できない.この場合は特徴的なベクトルを二つ見出して次元を減らす必要がある.ここでは頻繁に使われるPCAで高次元データを2次元データになるように変換する.高次元データを2次元データにする過程でだいぶいろいろな情報を捨てているので当然データそのままの関係は示せていない.
sklearnはPCAもサポートしているので、それを使えば数行でかける.流れは高次元の入力XをPCAをして次元圧縮して変換を求め, transformでpca_Xに変換している.こうなれば2次元のデータになっているので2dのグラフにプロットすることができるようになる.
SVNの識別結果も表示するためにグラフの右側はSVNのpredictした結果に基づいた結果を表示している.両方とも同じ結果のようなので、今回は訓練データに対して100%識別できているようですね.
load_digitsで得られるデータは8×8の64次元の数字画像データ.今回はこれをPCAにかけるため64次元から2次元への圧縮を行っている.
可視化結果
寄与率の確認
pcaの因子寄与率は簡単に確認できる.上記のコードでpcaの直後の以下二つのprintを挿入すると寄与率が表示される.寄与率というのは、つまりどれだけこの2次元で元の64次元のデータを表現するのに役立っているかみたいな値を表している.すなわち値が高いほどこの次元で十分に元のデータの特徴を捉えられていることになる.
今回のデータでは寄与率は以下のようになっている。64次元から2次元まで次元圧縮したのに60%ほどデータを表せていて大きく情報を損なわずに表現できている模様.すなわちこの2dプロットはそこまで悪くないであろうことを確認できる.寄与率が低いとこんなに二つの点が分かれているようには見えない.もっとぐちゃぐちゃに点が混じっているようなものになる.
[0.43040435 0.16274709]
[0.43040435 0.59315144]
例えば入力のクラスを2クラスから10クラスに変えると当然より寄与率が下がっていく.すなわち次元が足りていない.10クラスにした場合のプロットと寄与率は以下.
[0.14890594 0.13618771]
[0.14890594 0.28509365]
Comments