Skip to content

Instantly share code, notes, and snippets.

@TonyMooori
Created February 5, 2016 11:38
Show Gist options
  • Save TonyMooori/866952978b88de6212cc to your computer and use it in GitHub Desktop.
Save TonyMooori/866952978b88de6212cc to your computer and use it in GitHub Desktop.
平均画像との相関係数を用いてmnistのラベルを予測するプログラム
#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