Created
February 5, 2016 11:38
-
-
Save TonyMooori/866952978b88de6212cc to your computer and use it in GitHub Desktop.
平均画像との相関係数を用いてmnistのラベルを予測するプログラム
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: utf-8 | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from sklearn.datasets import fetch_mldata | |
from sklearn.cross_validation import train_test_split | |
from sklearn.metrics import confusion_matrix, classification_report | |
def corrcoef(x,y): | |
""" ベクトルx,yの相関係数を求める関数 """ | |
# ノルムが0になる場合はないものとします | |
# 要素の平均を引く | |
x = x - np.average(x) | |
y = y - np.average(y) | |
# ベクトルの内積はベクトルを転置して行列の積となる | |
return x.T.dot(y)/(np.linalg.norm(x)*np.linalg.norm(y)) | |
# mnistの手書き数字データをロード | |
# カレントディレクトリ(.)にない場合は、 | |
# Webから自動的にダウンロードされる(時間がかかるので注意!) | |
# 70000サンプル,28x28ピクセル | |
mnist = fetch_mldata('MNIST original', data_home=".") | |
""" | |
# 100個適当に表示してみる | |
for i in range(10): | |
for j in range(10): | |
img = mnist.data[ mnist.target == i ][j] | |
plt.subplot(10, 10, 10 * i + j + 1) | |
plt.axis('off') | |
plt.imshow( img.reshape(28, 28), cmap=plt.cm.gray_r, interpolation='nearest') | |
plt.show() | |
""" | |
# 訓練データを作成 | |
X = mnist.data | |
y = mnist.target | |
# 訓練データとテストデータに分解 | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1./7.) | |
# 代表値を作成する | |
avg_img = np.zeros((10,X_train.shape[1])) | |
for i in range(10): | |
# ラベルがiの画像を取り出して,平均をとる | |
i_imgs = X_train[ y_train == i ] | |
avg_img[i] = np.average(i_imgs,axis=0) | |
""" | |
# 代表値(平均画像)を表示してみる | |
for i in range(10): | |
img = avg_img[i] | |
plt.subplot(1, 10, i + 1) | |
plt.axis('off') | |
plt.imshow( img.reshape(28, 28), cmap=plt.cm.gray_r, interpolation='nearest') | |
plt.show() | |
""" | |
# 予測 | |
predictions = np.zeros(y_test.shape) | |
for i in range(len(y_test)): | |
test = X_test[i].astype(np.float) | |
# 内積が最も大きいものを予想ラベルとする | |
predictions[i] = np.argmax( [ corrcoef(test,img) for img in avg_img ] ) | |
# 評価 | |
print (confusion_matrix(y_test, predictions)) | |
print (classification_report(y_test, predictions)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment