Die Analyse handgeschriebener Zahlen wurde zu einer Reihe zusammengefasst, aber dieses Mal möchte ich mithilfe der Hauptkomponentenanalyse (PCA) und der linearen Diskriminanzanalyse (LDA) analysieren, die als überwachte Version bezeichnet werden können. Ich denke. Ich verwende die Python-Bibliothek für maschinelles Lernen scikit-learn.
Handschriftliche Zahlen mit Python spielen Teil 1 [Handschriftliche Zahlen mit Python spielen Teil 2 (identifizieren)] (http://qiita.com/kenmatsu4/items/2d21466078917c200033) [Maschinelles Lernen] Schreiben Sie die Methode des k-nächsten Nachbarn selbst in Python und erkennen Sie handgeschriebene Zahlen
Zunächst die Hauptkomponentenanalyse. Grundsätzlich handelt es sich um eine Analyse, die mehrere Datenelemente sammelt und die sogenannte Hauptkomponente extrahiert. Beim maschinellen Lernen denke ich, dass es hauptsächlich mit der Absicht verwendet wird, die Dimension der Zieldaten zu reduzieren. Da es sich bei den hier behandelten handschriftlichen Zahlen um Bilddaten von 28 x 28 = 784 Pixel handelt, handelt es sich um einen 784-dimensionalen Vektor. Wir werden jedoch versuchen, diese Dimension zu reduzieren.
Wie in der folgenden Abbildung gezeigt, werden wir anhand eines Beispiels erklären, wie zweidimensionale Informationen in eine Dimension verschoben werden. Als häufig verwendetes Beispiel denke ich, dass es eine Möglichkeit gibt, zwei Hauptkomponenten wie wissenschaftliche Fähigkeiten und literarische Fähigkeiten aus den Noten jedes Fachs wie japanische Sprache, Arithmetik, Wissenschaft und Gesellschaft zu extrahieren, aber dies erklärt das Bild. Ich will. Da ich es in der Abbildung zeigen möchte, werde ich Testdaten für zwei Probanden verwenden, die horizontale Achse ist Mathematik und die vertikale Achse ist naturwissenschaftlich. In diesem Fall sind sowohl Mathematik als auch Naturwissenschaften Fähigkeiten der Naturwissenschaften, daher scheint es eine Korrelation zu geben. Die blaue gerade Linie ist die Hauptkomponente: Sie repräsentiert die wissenschaftlichen Fähigkeiten. Wie durch die Pfeile gezeigt, kann die Stelle, an der die Linie senkrecht zu dieser geraden Linie von jedem Daten entfernt wird, als eindimensionale Daten als Fähigkeit der Wissenschaft ausgedrückt werden.
Es ist ein Diagramm, nachdem es eindimensional gemacht wurde.
Die Länge der senkrechten Linie, die von den in der folgenden Abbildung gezeigten Datenpunkten zur geraden Linie der Hauptkomponente gezogen wird, wird als Informationsverlust bezeichnet. Es ist der Teil, der verloren geht, wenn Sie die Dimension reduzieren. Die gerade Linie der Hauptkomponente verläuft durch den Durchschnittspunkt der Daten, und die Steigung, die diesen Informationsverlust minimiert, wird abgeleitet und bestimmt. Dies ist auch die Methode der minimalen Quadrate. Die Berechnung wird durchgeführt, um die Summe der Quadrate des Betrags des Informationsverlusts zu minimieren.
Wie ich bereits über die Höhe des Informationsverlusts erwähnt habe, gibt es auch das Konzept des Beitragssatzes, das untrennbar damit verbunden ist. Grob gesagt ist es das Verhältnis, wie viel die Hauptkomponente erklären kann. Im Beispiel der Zusammenfassung von Mathematik und Naturwissenschaften als naturwissenschaftliche Fähigkeit 1 = Beitragssatz der ersten Hauptkomponente (wissenschaftliche Fähigkeit) + Informationsverlustrate (andere) = 0,89997 + 0,10003 So könnten etwa 90% in einer Dimension erklärt werden.
Lassen Sie uns nun eine Hauptkomponentenanalyse für numerische Daten durchführen, die vorerst in Python geschrieben wurden. Lassen Sie uns zunächst analysieren, was mit der Variation der Daten für jede Zahl geschieht, indem Sie sie in jede Zahl aufteilen, anstatt sie für die gesamten Daten zu tun. Unten ist der Hauptcode-Teil. (Der gesamte Code ist hier)
#Daten lesen
raw_data= np.loadtxt('train_master.csv',delimiter=',',skiprows=1)
#dataset = DigitDataSet(raw_data)
dataset = DigitDataSet(raw_data)
data = [None for i in range(10)]
for i in range(10):
data[i] = dataset.getByLabel(i,'all')
#Führen Sie eine Hauptkomponentenanalyse durch
#Berechnen Sie die Differenz des Beitragssatzes in Abhängigkeit von der Anzahl der Dimensionen nach der Reduzierung
comp_items = [5,10,20,30] #Liste der Abmessungen nach der Reduzierung
cumsum_explained = np.zeros((10,len(comp_items)))
for i, n_comp in zip(range(len(comp_items)), comp_items):
for num in range(10): #Analysieren Sie jede Zahl
pca = decomp.PCA(n_components = n_comp) #Erstellen eines Hauptkomponentenanalyseobjekts
pca.fit(data[num]) #Führen Sie eine Hauptkomponentenanalyse durch
transformed = pca.transform(data[num]) #Generieren Sie einen reduzierten Vektor für Daten
E = pca.explained_variance_ratio_ #Beitragssatz
cumsum_explained[num, i] = np.cumsum(E)[::-1][0] #Kumulativer Beitragssatz
print "| label |explained n_comp:5|explained n_comp:10|explained n_comp:20|explained n_comp:30|"
print "|:-----:|:-----:|:-----:|:-----:|:-----:|"
for i in range(10):
print "|%d|%.1f%|%.1f%|%.1f%|%.1f%|"%(i, cumsum_explained[i,0]*100, cumsum_explained[i,1]*100, cumsum_explained[i,2]*100, cumsum_explained[i,3]*100)
Die folgende Tabelle zeigt jeden kumulierten Beitragssatz, wenn die Anzahl der Dimensionen nach der Reduzierung 5, 10, 20 und 30 beträgt. Wenn beispielsweise die Anzahl der Dimensionen 30 beträgt, wird sie von der ursprünglichen Anzahl der Dimensionen von 784 auf 30 reduziert und zeigt an, welcher Prozentsatz durch den 30-dimensionalen Vektor erklärt wird. Es gibt Variationen für jede Zahl, aber wenn Sie bis zu 30 Dimensionen annehmen, können Sie ungefähr 70% erklären. Die Anzahl der Dimensionen wurde von 784 auf 30 reduziert, was ungefähr 4% entspricht, aber es ist ziemlich leicht zu glauben, dass 7,80% erklärt werden können.
label | explained n_comp:5 | explained n_comp:10 | explained n_comp:20 | explained n_comp:30 |
---|---|---|---|---|
0 | 48.7% | 62.8% | 75.9% | 82.0% |
1 | 66.6% | 76.6% | 84.8% | 88.7% |
2 | 36.5% | 51.9% | 67.2% | 75.3% |
3 | 39.7% | 53.7% | 68.3% | 75.8% |
4 | 39.4% | 56.3% | 70.7% | 77.9% |
5 | 42.3% | 55.5% | 69.7% | 77.0% |
6 | 44.5% | 59.7% | 74.0% | 80.9% |
7 | 45.9% | 61.0% | 74.2% | 80.6% |
8 | 36.3% | 49.6% | 65.5% | 74.1% |
9 | 43.2% | 58.5% | 73.4% | 80.4% |
Die folgende Grafik zeigt die 10 Hauptkomponenten nach der Reduzierung. Sie sind in absteigender Reihenfolge des Beitragssatzes von links oben angeordnet. (Der Teil von exp: ist der Beitragssatz)
Früher haben wir die Hauptkomponentenanalyse für jede Zahl angewendet, dann aber die Hauptkomponentenanalyse auf alle 43000 numerischen Daten angewendet und schließlich die Dimension auf zwei Dimensionen reduziert. Es scheint, dass es zu stark von 784 Dimensionen auf 2 Dimensionen fallen gelassen wird, aber wenn es auf 2 Dimensionen geändert wird, wird ein Diagramm gezeichnet. Die folgende Grafik ist eine zweidimensionale Darstellung aller Daten. Es ist eine ziemlich überfüllte Figur geworden. Dies liegt daran, dass die Hauptkomponentenanalyse die Hauptkomponenten gemeinsam berechnet, ohne zu berücksichtigen, welche Anzahl jeder Datenpunkt ist. LDA ist eine Analyse, die berücksichtigt, welche Zahl für jeden Punkt gilt, aber ich möchte dies beim nächsten Mal erläutern. In jedem Fall halte ich es für einen großen Vorteil, es in einem Diagramm sehen zu können, indem man es in zwei Dimensionen ablegt.
** Grafik mit allen Punkten **
** Ein Diagramm, in dem die gemittelten Punkte aufgezeichnet und in einer Größe ausgedrückt werden, die proportional zur Varianz ist **
Hier ist der Hauptteil des Python-Codes.
# PCA ALL
pca = decomp.PCA(n_components = 2)
pca.fit(dataset.getData())
transformed = pca.transform(dataset.getData())
colors = [plt.cm.hsv(0.1*i, 1) for i in range(10)]
plt.figure(figsize=(16,11))
for i in range(10):
plt.scatter(0,0, alpha=1, c=colors[i],label=str(i))
plt.legend()
for l, d in zip(dataset.getLabel(), transformed):
plt.scatter(d[0],d[1] , c=colors[int(l)], alpha=0.3)
plt.title("PCA(Principal Component Analysis)")
plt.show()
#Zeichnen Sie den repräsentativen Wert jeder Zahl in ein Diagramm
transformed = [pca.transform(dataset.getByLabel(label=i,num=('all'))) for i in range(10)]
ave = [np.average(transformed[i],axis=0) for i in range(10)]
var = [np.var(transformed[i],axis=0) for i in range(10)]
plt.clf()
plt.figure(figsize=(14,10))
for j in range(10):
plt.scatter(100,100, alpha=1, c=colors[j],label=str(j))
plt.legend()
plt.xlim(-1500, 1500)
plt.ylim(-1500, 1500)
for i, a, v in zip(range(10), ave, var):
print i, a[0], a[1]
plt.scatter(a[0], a[1], c=colors[i], alpha=0.6, s=v/4, linewidth=1)
plt.scatter(a[0], a[1], c="k", s=10)
plt.text(a[0], a[1], "digit: %d"%i, fontsize=12)
plt.title("PCA Representative Vector for each digit.")
plt.savefig("PCA_RepVec.png ")
plt.show()
Recommended Posts