Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)

Identifizieren Sie handschriftliche numerische Daten

Im vorherigen Artikel habe ich handgeschriebene numerische Daten gelesen und abgebildet und dann die Korrelation betrachtet, aber dieses Mal möchte ich die Nummer identifizieren.

Da es sich um eine handschriftliche Nummernidentifikation handelt, wird identifiziert, welcher der 10 Klassen von 0 bis 9 die angegebenen Daten entsprechen. So zuerst,


C = \{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\}

Definieren Sie 10 Klassen von.

Eine der Methoden des maschinellen Lernens heißt "überwachtes Lernen", und dieses Muster wird verwendet. Wenn ein Lehrer im Voraus eine bestimmte Anzahl korrekter Antwortdaten sammelt und analysiert, wird ein zur Identifizierung erforderlicher Diskriminator erstellt, und die Daten, die Sie tatsächlich identifizieren möchten, werden zur Identifizierung in diesen Diskriminator eingegeben. Es ist der Weg. Diese im Voraus vorbereiteten Daten werden als Lehrerdaten bezeichnet.

Vorlagenübereinstimmung

Dieses Mal möchte ich versuchen, Zahlen mithilfe der Template-Matching-Methode zu erkennen. Definieren Sie den repräsentativen Wert jedes Etiketts (hier die Nummern 0 bis 9) und erstellen Sie einen Klassifikator. Diesmal wird der Durchschnittswert der Lehrerdaten als repräsentativer Wert verwendet. Wir berechnen den Abstand zwischen diesem repräsentativen Wert und den zu identifizierenden übergebenen Daten und sagen, dass er zur Klasse des repräsentativen Werts mit dem kürzesten Abstand gehört.

Das letzte Mal habe ich mich mit handgeschriebenen numerischen Daten von "train_small.csv" befasst, aber diesmal ist es die vollständige Datenversion "train.csv" ( 42.000 Daten) werden als Lehrerdaten für das Lernen verwendet. Da die numerischen Daten 28x28-Bilddaten verwenden, können sie durch einen 784-dimensionalen Vektor dargestellt werden, und jede der Lehrerdaten ist


y_i= (y_1, y_2,...,y_{784})       (i=0,1,...,9)

Es wird ausgedrückt als. $ i $ ist eine Klasse für jede Zahl.

Hier wird der repräsentative Wert als $ \ hat {y} _i $ beschrieben.

Der repräsentative Wert einer Klasse mit der Nummer 8 ist beispielsweise $ \ hat {y} _8 $. Die repräsentativen Werte sind im Durchschnitt wie folgt.

$ n_i $ ist die Anzahl der Lehrerdaten für jede Nummer.

\hat{y}_i = \frac{1}{n_i}\sum_{j=1}^{n_i} y_j

Wenn nun die zu identifizierenden Zieldaten als $ x_j $ ausgedrückt werden


x_j= (x_1, x_2,...,x_{784})

Da es auch durch einen 784-dimensionalen Vektor als Diskriminator dargestellt wird

{\rm argmin}_i{({\rm distance}_i)} = {\rm argmin}_i{(\|\hat{y}_i - x_j\|)}

Wird genutzt.

Ableitung und Anzeige repräsentativer Werte

Ich werde tatsächlich berechnen. Importieren Sie zuerst die erforderlichen Bibliotheken.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from collections import defaultdict

Definieren Sie eine Funktion als Dienstprogramm. Die erste Ziffer ist die Beschriftung, und die folgenden sind die Daten, also die Funktion add_image (), die sie unterteilt und nach Klassen klassifiziert, die Funktion count_label (), die die Nummer jeder Beschriftung zählt, und plot_digits () für das Zeichnen von Diagrammen.

image_dict = dict()

def add_image(label, image_vector):
    vec = np.array(image_vector)
    if label in image_dict:
        image_dict[label] += vec
    else:
        image_dict[label] = vec
    return image_dict

label_dd = defaultdict(int)
def count_label(data):
    for d in data:
        label_dd[d[0]] += 1
    return label_dd

def plot_digits(X, Y, Z, size_x, size_y, counter, title):
    plt.subplot(size_x, size_y, counter)
    plt.title(title)
    plt.xlim(0,27)
    plt.ylim(0,27)
    plt.pcolor(X, Y, Z)
    plt.gray()
    plt.tick_params(labelbottom="off")
    plt.tick_params(labelleft="off")

Erstellen Sie zunächst einen repräsentativen Wert $ \ hat {y} _i $ und zeigen Sie ihn als Bild an.


size = 28
raw_data= np.loadtxt('train_master.csv',delimiter=',',skiprows=1)

# draw digit images
plt.figure(figsize=(11, 6))

# data aggregation
for i in range(len(raw_data)):
    add_image(raw_data[i,0],raw_data[i,1:785])

count_dict = count_label(raw_data)

standardized_digit_dict = dict()   #Wörterbuchobjekt, das repräsentative Werte speichert
count = 0
for key in image_dict.keys(): 
    count += 1
    X, Y = np.meshgrid(range(size),range(size))
    num = label_dd[key]
    Z = image_dict[key].reshape(size,size)/num
    Z = Z[::-1,:]
    standardized_digit_dict[int(key)] = Z
    plot_digits(X, Y, standardized_digit_dict[int(key)], 2, 5, count, "")

plt.show()

standardize.png

Als ich das letzte Mal einzelne Daten visualisierte und anzeigte, gab es einige, bei denen es sich anscheinend nicht um Zahlen handelte. Wenn Sie jedoch viele Daten überlagern und den Durchschnitt ermitteln, werden schöne Zahlen angezeigt. Dies wird als repräsentativer Wert für jede Klasse verwendet und mit den zu identifizierenden Daten verglichen.

Identifikation durchführen: Versuchen Sie es zuerst mit einem

Es ist schließlich die Ausführung der Identifizierung. Zunächst möchte ich sehen, wie groß der Abstand zwischen den Identifikationszieldaten und dem repräsentativen Wert jeder Klasse ist, um das Bild zu erfassen. Die Identifikationszieldaten werden von Kaggle heruntergeladen. Verwenden Sie test.csv auf der Datenseite (https://www.kaggle.com/c/digit-recognizer/data). Da es einige gibt, bereiten wir die Daten vor, die aus den ersten 200 extrahiert wurden (test_small.csv).

test_data= np.loadtxt('test_small.csv',delimiter=',',skiprows=1)

# compare 1 tested digit vs average digits with norm 
plt.figure(figsize=(10, 9))

for i in range(1):    #Versuchen Sie nur den ersten
    result_dict = defaultdict(float)
    
    X, Y = np.meshgrid(range(size),range(size))
    Z = test_data[i].reshape(size,size)
    Z = Z[::-1,:]
    flat_Z = Z.flatten()
    plot_digits(X, Y, Z, 3, 4, 1, "tested")
    
    count = 0
    for key in standardized_digit_dict.keys(): 
        count += 1
        X1 = standardized_digit_dict[key]
        flat_X1 = standardized_digit_dict[key].flatten()
        norm = np.linalg.norm(flat_X1 - flat_Z)   #Ableitung des Abstands zwischen jedem repräsentativen Wert und den zu identifizierenden Daten
        plot_digits(X, Y, X1, 3, 4, (1+count), "d=%.3f"% norm)

plt.show()

digit_compare1.png

Die Identifikationszieldaten sind "2", aber was ist mit dem Ergebnis? Der Abstand wird über jedem Bild angezeigt. Bei dieser Zahl ist d = 1870.936 über "2" die kleinste! Identifikation ist erfolgreich! : entspannt:

Ausführung der Identifikation: Identifikationsergebnis von 200 Daten

Lassen Sie uns nun 200 Daten identifizieren und sehen, wie genau sie sind.


# recognize digits
plt.figure(figsize=(15, 130))

for i in range(len(test_data)):
    result_dict = defaultdict(float)
    
    X, Y = np.meshgrid(range(size),range(size))
    tested = test_data[i].reshape(size,size)
    tested = tested[::-1,:]
    flat_tested = tested.flatten()
    
    norm_list=[]
    count = 0
    for key in standardized_digit_dict.keys(): 
        count += 1
        sdd = standardized_digit_dict[key]
        flat_sdd = sdd.flatten()
        norm = np.linalg.norm(flat_sdd - flat_tested)
        norm_list.append((key, norm))
    
    norm_list = np.array(norm_list)
    min_result = norm_list[np.argmin(norm_list[:,1])]
    
    plot_digits(X, Y, tested, 40, 5, i+1, "l=%d, n=%d" % (min_result[0], min_result[1]))
    
plt.show()

Ich habe versucht, 200 Identifikationszieldaten auf dieses Identifikationsgerät anzuwenden, und die korrekte Antwortrate betrug 80% (160/200), was ein schlechtes Ergebnis war! : smile: Ist es nicht ein gutes Ergebnis für die einfache Methode, nur den Abstand vom Durchschnittswert zu messen? In der folgenden Abbildung finden Sie aktuelle Detaildaten.

digit_compare2.png

Bei der Analyse der Fälle, die nicht identifiziert werden konnten, war es besonders schwierig, zwischen 4 und 9 zu unterscheiden, und es traten 6 Identifikationsfehler auf. Als nächstes sind 1-7, 1-8, 3-5, 3-8, 3-9, 8-9 jeweils drei Fehler. Immerhin sehen die Zahlen etwas ähnlich aus.

** Zusammenfassung des Identifikationsfehlers **

combination of label count
4-9 6
1-7 3
1-8 3
3-5 3
3-8 3
3-9 3
8-9 3
2-3 2
4-6 2
0-2 1
0-3 1
0-4 1
0-5 1
0-8 1
1-2 1
1-3 1
1-5 1
2-7 1
2-8 1
4-7 1
5-9 1

Übersicht über die Template-Matching-Methode

Abschließend möchte ich einen kurzen Überblick über die Template-Matching-Methode geben. Die numerischen Daten sind diesmal 28x28 784-dimensionale Daten und die Anzahl der Dimensionen ist hoch, so dass sie nicht grafisch dargestellt werden können, aber ich werde es erklären, als ob es zweidimensional wäre, um ein Bild zu ergeben. Siehe das Streudiagramm unten. Die Daten für jede Zahlenklasse können durch Farbe unterschieden werden, und die Daten werden gestreut. Dies ist ein Bild einer Reihe von Lehrerdaten. Nehmen Sie dies als repräsentativen Wert und mitteln Sie ihn. Typische Werte werden durch etwas größere Punkte in der Grafik dargestellt.

plots.png

Wenn beispielsweise der schwarze Punkt unten die Identifikationszieldaten sind, ist der nächste repräsentative Wert der repräsentative Wert der Klasse "7", so dass diese Identifikationszieldaten als Klasse "7" identifiziert werden. Dies ist die diesmal verwendete Template-Matching-Methode.

plots2.png

Recommended Posts

Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Spielen Sie handschriftliche Zahlen mit Python Part 1
Spielen Sie mit 2016-Python
Bildverarbeitung mit Python (Teil 2)
Python mit freeCodeCamp Teil1 studieren
Angrenzende Bilder mit Python Teil 1
Schaben mit Selen + Python Teil 1
Beurteilung von Primzahlen mit Python
Python studieren mit freeCodeCamp part2
Bildverarbeitung mit Python (Teil 1)
[Python] Spielen Sie mit Discords Webhook.
Nampre mit Python lösen (Teil 2)
Bildverarbeitung mit Python (3)
Schaben mit Selen + Python Teil 2
Spiele mit einer Schildkröte mit Schildkrötengrafiken (Teil 1)
Testen mit Zufallszahlen in Python
[Mit Python automatisiert! ] Teil 1: Datei einstellen
Lass uns mit Python mit Python spielen [Anfänger]
Automatisieren Sie einfache Aufgaben mit Python Part0
[Mit Python automatisiert! ] Teil 2: Dateivorgang
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
Spielen Sie eine Audiodatei von Python mit Interrupt ab
FM-Modulation und Demodulation mit Python Part 3
Verarbeiten Sie Pubmed .xml-Daten mit Python [Teil 2]
Automatisieren Sie einfache Aufgaben mit Python Part1 Scraping
Fraktal zum Erstellen und Spielen mit Python
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
Bearbeiten von Azure CosmosDB aus Python Part.2
Ich möchte mit aws mit Python spielen
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
FM-Modulation und Demodulation mit Python Part 2
[Teil1] Scraping mit Python → Organisieren Sie bis zu CSV!
[Python] Visualisiere und identifiziere langsame Teile mit pytest
Spiel mit dem Propheten
QGIS + Python Teil 2
Python-Handspiel (Beginnen wir mit AtCoder?)
FizzBuzz in Python3
Scraping mit Python
[REAPER] Wie man Reascript mit Python spielt
Spielen Sie mit Google Spread Sheet mit Python (OAuth)
Statistik mit Python
Erzeugung von zwei korrelierten Pseudozufallszahlen (mit Python-Beispiel)
Scraping mit Python
Python mit Go
QGIS + Python Teil 1
Maschinelles Lernen beginnend mit Python Personal Memorandum Part1
Spiele mit PyTorch
Twilio mit Python
In Python integrieren
Spielen Sie Python async
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
Hinweis zum Formatieren von Zahlen mit der Python-Formatierungsfunktion
mit Syntax (Python)
So messen Sie die Ausführungszeit mit Python Teil 1