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
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.
Zweck:
Zielgruppe: ・ Ich verstehe die grundlegende Theorie des maschinellen Lernens, möchte aber ein Beispiel dafür sehen, wie andere Leute sie in Code implementieren.
Umwelt: ・ MacBook Air ・ OSX 10.11.6 · Python 3.x. ・ Numpy ・ Pandas ・ Sklearn
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()
■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.
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 ■ Nummern 4 und 9
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])
■ 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.
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