scikit-learnを使ってPCAによる次元削減を7行で書いてみた


高次元のデータを解析する場合、データの分布などが見てもわからないので、PCAを使って次元削減をしてから可視化する場合があります。
PCAについてはこれまでにこのブログでも何度も触れているのでそちらを参照してください。

今回はフランスのINRIAがFundingしているscikit-learnというライブラリを使って7行で(空行含まず)書いてみました。言語はPythonです。

import numpy
import sklearn.decomposition

dim=2
data=numpy.loadtxt("data.csv", delimiter=",")
pca=sklearn.decomposition.PCA(dim)

result=pca.fit_transform(data);
numpy.savetxt("result.csv", result, delimiter=",")

たったこれだけで、data.csvというファイル(行ごとに多次元データがカンマ区切りで入っている)を読み込み、PCAで次元削減(2次元へ圧縮)したあとresult.csvというファイルに書き出しています。

白色化する場合は pca.whiten=True という行を、fit_transform の前に入れればOKだと思います。

PCAというより、numpy.loadtxt / numpy.savetxt 素晴らしい!という内容になりました。

matplotlibで3次元データのプロット


Pythonのグラフ描画用のライブラリであるmatplotlibを使って、3次元データのプロットを行ったときのメモ。

matplotlibで2次元のデータ( y = f(x) のようなもの )の散布図を描画するのは簡単で、matplotlibの中のpyplotを使って

import numpy
import matplotlib.pyplot as plt

xs=numpy.random.rand(1,100)
ys=numpy.random.rand(1,100)

plt.scatter(xs, ys)
plt.show()

でできる。結果はこのような感じ。

(もちろん先に関数fを定義しておく必要はある。上の例ではランダムな値を入れている)
要は、同じ数のデータ系列が2つあれば、それをx,y軸の値に取るような散布図を描画できる。

これを3次元でやりたい。要はx, y, zの3つの同じ数のデータが合った時の散布図を作りたい。
これはちょっと面倒で、mpl_toolkits.mplot3dというのを使う。

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D

xs=numpy.random.rand(1,100)
ys=numpy.random.rand(1,100)
zs=numpy.random.rand(1,100)

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

ax.scatter3D(xs, ys, zs)
plt.show()

これで下のような感じのプロットができる。

Tokyo.SciPy#4 出張版 (aka Kan.SciPy#1)で発表しました


※だいぶ前の話ですが

先日のTokyo.SciPy#4 出張版 (aka Kan.SciPy#1)で発表してきました。
Tokyo.SciPyはその名の通り、東京で行われているSciPy (Scientific Python)の勉強会です。
今回、特別に出張版として関西で開催されました。
そのため、名前はKan.SciPyとなっています。

僕は画像処理でPythonを(そしてNumPy及びSciPyを)使い始めていたので、 それに関して発表させていただきました。
資料はslideshareにアップしています。

発表するにあたって色々いじったので、だいぶPythonで画像処理をする事に関するノウハウが貯まったように思います。
それに関して、今後またこのブログで書いて行きたいと思います。