めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

pythonでクラスごとの分布をPCAで可視化して問題の難しさを確かめる

やりたいこと

主成分分析を行い、データを低次元に表す。 その分布をクラスごとに可視化して、クラスごとに分布が違っている(分布が重なっていない)なら予測が簡単そうだ、とわかるしPCAを教師なしの線形分離器の見れば線形分離可能かも確認できそう。

データを二次元で可視化

from sklearn.decomposition import PCA
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
X, y = load_data()

pca2d = PCA(n_components=2).fit(X)
X_2d = pca2d.transform(X)

true_label = X_2d[np.where(yd==1)]
plt.scatter(true_label[:,0], true_label[:,1], marker='x', alpha=.5, color='b', label='T')

false_label = X_2d[np.where(yd==0)]
plt.scatter(false_label[:,0], false_label[:,1], marker='x', alpha=.3, color='r', label='F')
plt.legend()
plt.show()

データを二次元にまで圧縮して、それの散布図を確認する。

f:id:misos:20161020005512p:plain

T, Fのクラスが完全に重なっているので、二次元では分離できそうにない。

データを三次元で可視化

from sklearn.decomposition import PCA
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

pca3d = PCA(n_components=3).fit(X)
X_3d = pca3d.transform(X)

fig = plt.figure()
ax = Axes3D(fig)

true_label = X_3d[np.where(yd==1)]
ax.plot_wireframe(true_label[:,0],true_label[:,1],true_label[:,2], alpha=.5, color='b', label='T')

false_label = X_3d[np.where(yd==0)]
ax.plot_wireframe(false_label[:,0],false_label[:,1],false_label[:,2], alpha=.5, color='r', label='F')
plt.legend()
plt.show()

f:id:misos:20161020005658p:plain

ちょっと適当にやりすぎたが、ちゃんとしたデータなら三次元空間で赤と青の塊が分かれてくれると思う。 完全に分かれていたら線形のモデル(ロジスティック回帰、リッジなど)でも簡単にできる問題とわかるはず。

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。