[PYTHON] Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes

Bonjour. Je voudrais garder le contenu appris dans la classe universitaire à qiita comme mémorandum. J'ai posté l'exemple de code sur github, donc je ne suis pas sûr qu'il sera utile, mais si vous êtes intéressé, jetez un œil. https://github.com/tkshim/MNIST/blob/master/BayesMNIST.py

  1. Contenu: -PCA (analyse des composants principaux) est utilisé pour réduire les dimensions du vecteur de caractéristiques, et un simple classificateur bayésien est utilisé pour reconnaître les images numériques.

  2. Objectif: -Partagez des exemples de code (Python) en utilisant l'apprentissage automatique.

  3. Public cible: ・ Je comprends la théorie de base de l'apprentissage automatique, mais j'aimerais voir un exemple de la façon dont d'autres personnes l'implémentent dans le code.

  4. Environnement: · Macbook Air ・ OSX 10.11.6 · Python 3.x ・ Numpy ・ Pandas ・ Sklearn

  5. Résumé: ・ J'ai utilisé le NB gaussien intégré de sklearn, mais j'ai pu obtenir une précision dans la seconde moitié de 80%.

■step1 L'ensemble de données à analyser est téléchargé à partir de la page d'accueil du professeur Lucan de l'Université de New York. http://yann.lecun.com/exdb/mnist/index.html Définissez les variables de stockage de données en fonction de votre environnement.

DATA_PATH = '/Users/takeshi/MNIST_data'
TRAIN_IMG_NAME = 'train-images.idx3-ubyte'
TRAIN_LBL_NAME = 'train-labels.idx1-ubyte'
TEST_IMG_NAME = 't10k-images.idx'
TEST_LBL_NAME = 't10k-labels.idx'

■step2, step3 Lisez les ensembles de données d'entraînement et de test sous la forme d'un tableau de numpy. Vous pouvez utiliser imshow pour voir quel nombre chaque donnée représente, comme indiqué ci-dessous.

print("The shape of matrix is : ", Xtr.shape)
print("Label is : ", Ttr.shape)
plt.imshow(Xte[0].reshape(28, 28),interpolation='None', cmap=cm.gray)
show()

digit7.png

■step4 C'est le cœur de PCA. Les données d'image sont représentées par 28x28 = 784 données, et les vecteurs propres de ces 784 vecteurs de caractéristiques sont calculés inversement en utilisant la fonction huit.

X = np.vstack((Xtr,Xte))
T = np.vstack((Ttr,Tte))
print (X.shape)
print (T.shape)

import numpy as np;
import numpy.linalg as LA;
μ=np.mean(X,axis=0);#print(μ);
Z=X-μ;#print(Z);
C=np.cov(Z,rowvar=False);#print(C);
[λ,V]=LA.eigh(C);#print(λ,'\n\n',V);
row=V[0,:];col=V[:,0];
np.dot(C,row)/(λ[0]*row) ;
np.dot(C,col)/(λ[0]*col);
λ=np.flipud(λ);V=np.flipud(V.T);
row=V[0,:];
np.dot(C,row)/(λ[0]*row);
P=np.dot(Z,V.T);#print(P);

■step5 Il y a 784 vecteurs propres = composantes principales, mais au lieu d'utiliser tous, par exemple, en n'utilisant que deux (= réduction de dimension) et en appliquant ces deux vecteurs propres à GaussianNB, le modèle de reconnaissance est complété en premier.

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()

# Apply traing dataset to this model
# A: the number of training set
# B: the number of dimension
A = 60000
B = 2
model.fit(P[0:A,0:B],T[0:A])

■step6 S'il y a deux vecteurs propres, la précision des données de test sera de 44,7%, ce qui est un très mauvais nombre. ..

from sklearn import metrics
predicted = model.predict(P[A:70001,0:B])
expected = T[A:70001,]
print ('The accuracy is : ', metrics.accuracy_score(expected, predicted)*100, '%')

■step7 Ici, le rapport de classification et la matrice de confusion sont affichés afin que vous puissiez vérifier l'état de reconnaissance de chaque numéro.

import matplotlib.pyplot as plt
import seaborn as sns
print ('          === Classification Report ===')
print (metrics.classification_report(expected, predicted))

cm = metrics.confusion_matrix(expected, predicted)
plt.figure(figsize=(9, 6))
sns.heatmap(cm, linewidths=.9,annot=True,fmt='g')
plt.suptitle('MNIST Confusion Matrix (GaussianNativeBayesian)')
plt.show()

Lorsque le vecteur propre est 2, vous pouvez voir que le nombre "1" n'est pas mauvais à 83%, alors que "2" et "5" sont à peine reconnus correctement. report.png

cm.png

Pourquoi? C'est-à-dire que s'il n'y a que deux vecteurs propres, certains nombres se chevaucheront et il peut être difficile de déterminer quel nombre.

Jetons un coup d'œil à un exemple facile à comprendre. Dans la matrice ci-dessus, le nombre 4 est reconnu comme le nombre 1 0 fois, mais le nombre 9 est reconnu par erreur comme le nombre 9 374 fois. Ci-dessous, un graphique en trois dimensions des vecteurs propres des nombres 1 et 4. Si c'est 1 et 4, vous pouvez voir que les ensembles de vecteurs propres sont nettement séparés. Mais qu'en est-il de 4 et 9? Il est presque usé et superposé.

■ Numéros 1 et 4 image.png ■ Numéros 4 et 9   image.png

Par conséquent, si vous augmentez progressivement le vecteur propre utilisé, la précision s'améliorera également. Dans cet environnement, régler le vecteur propre à environ 70 semble maximiser la précision (fin 80%).

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()

# Apply traing dataset to this model
# A: the number of training set
# B: the number of dimension
A = 60000
B = 70 # <-Augmente graduellement.
model.fit(P[0:A,0:B],T[0:A])

cm70.png

■ Comparaison entre les vecteurs propres 2 et 70 Voici la différence lorsque le nombre 0 est reproduit avec les vecteurs propres 2 et 70. Après tout, si vous l'augmentez à 70, vous pouvez voir que le contour devient beaucoup plus clair.

2.png

70.png

Xrec2=(np.dot(P[:,0:2],V[0:2,:]))+μ; #Reconstruction using 2 components
Xrec3=(np.dot(P[:,0:70],V[0:70,:]))+μ; #Reconstruction using 3 components
plt.imshow(Xrec2[1].reshape(28, 28),interpolation='None', cmap=cm.gray);
show()
plt.imshow(Xrec3[1].reshape(28, 28),interpolation='None', cmap=cm.gray);
show()

■ Résumé ・ La méthode d'apprentissage automatique a pu atteindre une précision dans la seconde moitié de 80%. ・ Cette fois, j'utilise le simple classificateur Bayes de sklearn, mais la prochaine fois, j'aimerais implémenter ce classificateur à partir de zéro en Python et viser la plage de 90%.

Recommended Posts

Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Détermination des maladies des arbres par reconnaissance d'image à l'aide de CNTK et SVM
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Reconnaissance d'image des fruits avec VGG16
À propos de l'itinéraire le plus court pour créer un modèle de reconnaissance d'image par apprentissage automatique et mettre en œuvre une application Android
Python: Application de la reconnaissance d'image à l'aide de CNN
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Reconnaissance d'image à l'aide de chevaux et de cerfs CNN
Prédire les travaux de courte durée de Weekly Shonen Jump par apprentissage automatique (Partie 2: Apprentissage et évaluation)
Tournoi Numerai - Fusion de quants traditionnels et apprentissage automatique -
Apprentissage parallèle du deep learning par Keras et Kubernetes
Analyse de l'utilisation de l'espace partagé par l'apprentissage automatique
[Français] scikit-learn 0.18 Introduction de l'apprentissage automatique par le didacticiel scikit-learn
Estimation raisonnable du prix de Mercari par apprentissage automatique
Classification des images de guitare par apprentissage automatique, partie 2
Implémentation du modèle Deep Learning pour la reconnaissance d'images
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Raisonnement causal utilisant l'apprentissage automatique (organisation des méthodes de raisonnement causal)
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer chapitres 1 et 2
Collecte et automatisation d'images érotiques à l'aide du deep learning
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Une méthode concrète pour prédire les courses de chevaux et simuler le taux de récupération par apprentissage automatique
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
Apprentissage des classements à l'aide d'un réseau neuronal (implémentation RankNet par Chainer)
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes - Partie 2
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (4)
Juger la victoire ou la défaite de Shadova par reconnaissance d'image
[Apprentissage automatique] Sélection de fonctionnalités de variables catégorielles à l'aide du test du chi carré
Classifier les ensembles de données d'image CIFAR-10 à l'aide de divers modèles d'apprentissage en profondeur
Reconnaissance d'image des déchets avec Edge (Raspberry Pi) à partir de zéro connaissance en utilisant AutoML Vsion et TPU