Pythonで0〜9の手書き数字画像データに慣れる!

今回は、手書き数字の画像データを扱うことに慣れることを目標にした記事です。データの読み込みや表示、各ラベルの平均値の取得・表示、PCAの実施と可視化などを取り上げました。まずは、sklearn.datasetsからload_digitsをインポートして、図を作成しましょう。

#coding: utf-8
import numpy as np
import pylab
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

#load digits data
digits = load_digits()

#transform each 8*8 images into a vector of length 64
X = digits.images.reshape((digits.images.shape[0],-1))
Y = digits.target
target_names = digits.target_names

# Show digits
for index, (image, label) in enumerate(zip(digits.images, digits.target)[:10]):
	pylab.subplot(2, 5, index+1)
	pylab.axis('off')
	pylab.imshow(image, cmap=pylab.cm.gray_r, interpolation='none')
	pylab.title('%i' % label)
pylab.show()

f:id:decompose:20160507003300p:plain
次に、各ラベルの画像データの平均値を取得してみます。こちらの場合でも最後に可視化を行います。

meanmatrix = np.zeros((10,8,8))
for i in range(10):
    test = X[y==i].mean(axis=0)
    meanmatrix[i,:,:] = np.reshape(test,(8,8))
    pylab.subplot(2,5,i+1)
    pylab.axis('off')
    pylab.imshow(meanmatrix[i,:,:],cmap=pylab.cm.gray_r, interpolation='none')
pylab.show()

f:id:decompose:20160507222844p:plain
標本数は2000近くありますが、それらを可視化してみます。そのためのPCAで2次元まで落としてみます。

#PCA on load_digits
pca = PCA(n_components=2)
X_r=pca.fit(X).transform(X)

#Visualize
colors = [plt.cm.nipy_spectral(i/10.,1) for i in range(10)]
plt.figure()
for c, target_name in zip(colors, target_names):
    plt.scatter(X_r[y==target_name,0],X_r[y==target_name,1],c=c,label=target_name)
plt.legend(scatterpoints=1)
plt.title('PCA of load_digits')
plt.show()

f:id:decompose:20160507003306p:plain

参考にしたサイト:
Scikit-learnでPCA - Qiita
多層パーセプトロンで手書き数字認識 - 人工知能に関する断創録