[PYTHON] Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes

Hallo. Ich möchte die in der Universitätsklasse in Qiita erlernten Inhalte als Memorandum behalten. Ich habe den Beispielcode auf github gepostet, bin mir also nicht sicher, ob er hilfreich sein wird, aber wenn Sie interessiert sind, schauen Sie bitte. https://github.com/tkshim/MNIST/blob/master/BayesMNIST.py

  1. Inhalt: -PCA (Hauptkomponentenanalyse) wird verwendet, um die Abmessungen des Merkmalsvektors zu reduzieren, und ein einfacher Bayes'scher Klassifikator wird verwendet, um die Bilderkennung von Zahlen durchzuführen.

  2. Zweck:

  1. Zielgruppe: ・ Ich verstehe die grundlegende Theorie des maschinellen Lernens, möchte aber ein Beispiel dafür sehen, wie andere Leute sie in Code implementieren.

  2. Umwelt: ・ MacBook Air ・ OSX 10.11.6 · Python 3.x. ・ Numpy ・ Pandas ・ Sklearn

  3. Zusammenfassung: ・ Ich habe sklearns eingebauten Gaußschen NB verwendet, konnte aber in der zweiten Hälfte von 80% eine Genauigkeit erzielen.

■step1 Der zu analysierende Datensatz wird von der Homepage von Professor Lucan von der University of New York heruntergeladen. http://yann.lecun.com/exdb/mnist/index.html Stellen Sie die Datenspeichervariablen entsprechend Ihrer Umgebung ein.

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 Lesen Sie die Trainings- und Testdatensätze als Array von Numpy. Mit imshow können Sie sehen, welche Zahl die einzelnen Daten darstellen (siehe unten).

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 Dies ist das Herzstück von PCA. Die Bilddaten werden durch 28 × 28 = 784 Daten dargestellt, und die Eigenvektoren dieser 784 Merkmalsvektoren werden unter Verwendung der Achtfunktion umgekehrt berechnet.

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 Es gibt 784 Eigenvektoren = Hauptkomponenten, aber anstatt alle zu verwenden, indem beispielsweise nur zwei (= Dimensionsreduktion) verwendet werden und diese beiden Eigenvektoren auf GaussianNB angewendet werden, wird das Erkennungsmodell zuerst abgeschlossen.

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 Wenn zwei Eigenvektoren vorhanden sind, beträgt die Genauigkeit der Testdaten 44,7%, was eine sehr schlechte Zahl ist. ..

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 Hier werden der Klassifizierungsbericht und die Verwirrungsmatrix angezeigt, damit Sie den Erkennungsstatus jeder Nummer überprüfen können.

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()

Wenn der Eigenvektor 2 ist, können Sie sehen, dass die Zahl "1" mit 83% nicht schlecht ist, aber "2" und "5" kaum richtig erkannt werden. report.png

cm.png

Warum? Das heißt, wenn nur zwei Eigenvektoren vorhanden sind, überlappen sich einige Zahlen und es kann schwierig sein, die Zahl zu bestimmen.

Schauen wir uns ein leicht verständliches Beispiel an. In der obigen Matrix wird die Nummer 4 0-mal als die Nummer 1 0 erkannt, aber die Nummer 9 wird fälschlicherweise 374-mal als die Nummer 9 erkannt. Unten ist eine dreidimensionale Darstellung der Eigenvektoren der Zahlen 1 und 4. Wenn es 1 und 4 ist, können Sie sehen, dass die Sätze von Eigenvektoren sauber getrennt sind. Aber was ist mit 4 und 9? Es ist fast abgenutzt und überlappt.

■ Nummern 1 und 4 image.png ■ Nummern 4 und 9   image.png

Wenn Sie daher den verwendeten Eigenvektor schrittweise erhöhen, verbessert sich auch die Genauigkeit. In dieser Umgebung scheint die Einstellung des Eigenvektors auf etwa 70 die Genauigkeit zu maximieren (späte 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 # <-Allmählich erhöhen.
model.fit(P[0:A,0:B],T[0:A])

cm70.png

■ Vergleich zwischen den Eigenvektoren 2 und 70 Das Folgende ist der Unterschied, wenn die Zahl 0 mit den Eigenvektoren 2 und 70 reproduziert wird. Wenn Sie es auf 70 erhöhen, können Sie schließlich sehen, dass der Umriss viel klarer wird.

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()

■ Zusammenfassung ・ Mit der Methode des maschinellen Lernens konnten wir in der zweiten Hälfte von 80% eine Genauigkeit erzielen. ・ Dieses Mal verwende ich den einfachen Bayes-Klassifikator von sklearn, aber beim nächsten Mal möchte ich diesen Klassifikator von Grund auf in Python implementieren und den 90% -Bereich anstreben.

Recommended Posts

Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes
Bestimmung von Baumkrankheiten durch Bilderkennung mit CNTK und SVM
Ähnliche Gesichtsbilderkennung mit Gesichtserkennung und PCA- und K-Mittel-Clustering
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Bilderkennung von Früchten mit VGG16
Über den kürzesten Weg, um ein Bilderkennungsmodell durch maschinelles Lernen zu erstellen und eine Android-Anwendung zu implementieren
Python: Anwendung der Bilderkennung mit CNN
Bilderkennungsmodell mit Deep Learning im Jahr 2016
Bilderkennung mit CNN Pferden und Hirschen
Vorhersage kurzlebiger Arbeiten von Weekly Shonen Jump durch maschinelles Lernen (Teil 2: Lernen und Bewertung)
Numerai Turnier-Fusion von traditionellen Quants und maschinellem Lernen-
Paralleles Lernen von Deep Learning durch Keras und Kubernetes
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
[Übersetzung] scikit-learn 0.18 Einführung in maschinelles Lernen durch Tutorial scikit-learn
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Implementierung eines Deep Learning-Modells zur Bilderkennung
Versuchen Sie es mit dem Jupyter Notebook von Azure Machine Learning
Kausales Denken mit maschinellem Lernen (Organisation von Methoden des kausalen Denkens)
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 1 und 2
Sammlung und Automatisierung erotischer Bilder durch Deep Learning
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Rank Learning über ein neuronales Netzwerk (RankNet-Implementierung von Chainer)
Untersuchung der Austauschprognosemethode mit Deep Learning und Wavelet-Konvertierung - Teil 2-
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Was ich über KI / maschinelles Lernen mit Python gelernt habe (4)
Beurteilung des Sieges oder der Niederlage von Shadova anhand der Bilderkennung
[Maschinelles Lernen] Funktionsauswahl kategorialer Variablen mithilfe des Chi-Quadrat-Tests
Klassifizieren Sie CIFAR-10-Bilddatensätze mithilfe verschiedener Modelle des Deep Learning
Bilderkennung von Müll mit Edge (Raspberry Pi) aus null Wissen mit AutoML Vsion und TPU