Inhaltsverzeichnis Kapitel 1: Lineares Regressionsmodell [Kapitel 2: Nichtlineares Regressionsmodell] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Kapitel 3: Logistisches Regressionsmodell] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Kapitel 4: Hauptkomponentenanalyse] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Kapitel 5: Algorithmus 1 (k-Nachbarschaftsmethode (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Kapitel 6: Algorithmus 2 (k-Mittel)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Kapitel 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)
y=w^Tx+b=\sum_{j=1}^{m} w_jx_j+b
Der Abstand zwischen der linearen Diskriminanzfunktion und dem nächsten Datenpunkt wird als Rand bezeichnet.
Finden Sie die lineare Diskriminanzfunktion, die den Rand maximiert
Der Rand hängt von den Parametern ab. SVM-Entscheidungsfunktion
y(x)=w^Tx+b=\sum_{j=1}^{m} a_it_ix~Tx+b
Unterstützungsvektor
Die Trainingsdaten, aus denen die Trennungs-Superebene besteht, sind nur der Unterstützungsvektor, und der Rest der Daten ist nicht erforderlich.
Weicher Rand SVM
Wenn die Probe nicht linear getrennt werden kann
Fehler tolerieren und Fehler bestrafen
Unterstützung auch wenn keine lineare Trennung möglich ist
Die Entscheidungsgrenze ändert sich abhängig von der Größe des Parameters C.
Kernel-Trick
Kernelfunktion
Drücken Sie das innere Produkt hochdimensionaler Vektoren mit einer Skalarfunktion aus
Berechnungskosten können unterdrückt werden, selbst wenn der Merkmalsraum hochdimensional ist
Trennung mit einem nichtlinearen Kernel
Eine nichtlineare Trennung ist möglich
Lagranges unbestimmte Multiplikatormethode
Definition
In Bezug auf die Support-Vektor-Maschine war es leicht zu verstehen, was ich im vorherigen "Maschinelles Lernen beginnend mit Raspberry Pi" gelernt habe, daher werde ich es mit einer Erinnerung beschreiben.
#Importieren Sie verschiedene Module, die Sie zuerst benötigen
from sklearn import datasets, svm
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
#Laden Sie Irisdaten und speichern Sie sie in einer variablen Iris
iris = datasets.load_iris()
#Speichern Sie die Features in Variable X und das Ziel in Variable y
X = iris.data
y = iris.target
#Inhaltsanzeige von X und y
print(X)
print(y)
Ergebnis
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]
[5.4 3.7 1.5 0.2]
[4.8 3.4 1.6 0.2]
[4.8 3. 1.4 0.1]
[4.3 3. 1.1 0.1]
[5.8 4. 1.2 0.2]
[5.7 4.4 1.5 0.4]
[5.4 3.9 1.3 0.4]
[5.1 3.5 1.4 0.3]
[5.7 3.8 1.7 0.3]
[5.1 3.8 1.5 0.3]
[5.4 3.4 1.7 0.2]
[5.1 3.7 1.5 0.4]
[4.6 3.6 1. 0.2]
[5.1 3.3 1.7 0.5]
[4.8 3.4 1.9 0.2]
[5. 3. 1.6 0.2]
[5. 3.4 1.6 0.4]
[5.2 3.5 1.5 0.2]
[5.2 3.4 1.4 0.2]
[4.7 3.2 1.6 0.2]
[4.8 3.1 1.6 0.2]
[5.4 3.4 1.5 0.4]
[5.2 4.1 1.5 0.1]
[5.5 4.2 1.4 0.2]
[4.9 3.1 1.5 0.2]
[5. 3.2 1.2 0.2]
[5.5 3.5 1.3 0.2]
[4.9 3.6 1.4 0.1]
[4.4 3. 1.3 0.2]
[5.1 3.4 1.5 0.2]
[5. 3.5 1.3 0.3]
[4.5 2.3 1.3 0.3]
[4.4 3.2 1.3 0.2]
[5. 3.5 1.6 0.6]
[5.1 3.8 1.9 0.4]
[4.8 3. 1.4 0.3]
[5.1 3.8 1.6 0.2]
[4.6 3.2 1.4 0.2]
[5.3 3.7 1.5 0.2]
[5. 3.3 1.4 0.2]
[7. 3.2 4.7 1.4]
[6.4 3.2 4.5 1.5]
[6.9 3.1 4.9 1.5]
[5.5 2.3 4. 1.3]
[6.5 2.8 4.6 1.5]
[5.7 2.8 4.5 1.3]
[6.3 3.3 4.7 1.6]
[4.9 2.4 3.3 1. ]
[6.6 2.9 4.6 1.3]
[5.2 2.7 3.9 1.4]
[5. 2. 3.5 1. ]
[5.9 3. 4.2 1.5]
[6. 2.2 4. 1. ]
[6.1 2.9 4.7 1.4]
[5.6 2.9 3.6 1.3]
[6.7 3.1 4.4 1.4]
[5.6 3. 4.5 1.5]
[5.8 2.7 4.1 1. ]
[6.2 2.2 4.5 1.5]
[5.6 2.5 3.9 1.1]
[5.9 3.2 4.8 1.8]
[6.1 2.8 4. 1.3]
[6.3 2.5 4.9 1.5]
[6.1 2.8 4.7 1.2]
[6.4 2.9 4.3 1.3]
[6.6 3. 4.4 1.4]
[6.8 2.8 4.8 1.4]
[6.7 3. 5. 1.7]
[6. 2.9 4.5 1.5]
[5.7 2.6 3.5 1. ]
[5.5 2.4 3.8 1.1]
[5.5 2.4 3.7 1. ]
[5.8 2.7 3.9 1.2]
[6. 2.7 5.1 1.6]
[5.4 3. 4.5 1.5]
[6. 3.4 4.5 1.6]
[6.7 3.1 4.7 1.5]
[6.3 2.3 4.4 1.3]
[5.6 3. 4.1 1.3]
[5.5 2.5 4. 1.3]
[5.5 2.6 4.4 1.2]
[6.1 3. 4.6 1.4]
[5.8 2.6 4. 1.2]
[5. 2.3 3.3 1. ]
[5.6 2.7 4.2 1.3]
[5.7 3. 4.2 1.2]
[5.7 2.9 4.2 1.3]
[6.2 2.9 4.3 1.3]
[5.1 2.5 3. 1.1]
[5.7 2.8 4.1 1.3]
[6.3 3.3 6. 2.5]
[5.8 2.7 5.1 1.9]
[7.1 3. 5.9 2.1]
[6.3 2.9 5.6 1.8]
[6.5 3. 5.8 2.2]
[7.6 3. 6.6 2.1]
[4.9 2.5 4.5 1.7]
[7.3 2.9 6.3 1.8]
[6.7 2.5 5.8 1.8]
[7.2 3.6 6.1 2.5]
[6.5 3.2 5.1 2. ]
[6.4 2.7 5.3 1.9]
[6.8 3. 5.5 2.1]
[5.7 2.5 5. 2. ]
[5.8 2.8 5.1 2.4]
[6.4 3.2 5.3 2.3]
[6.5 3. 5.5 1.8]
[7.7 3.8 6.7 2.2]
[7.7 2.6 6.9 2.3]
[6. 2.2 5. 1.5]
[6.9 3.2 5.7 2.3]
[5.6 2.8 4.9 2. ]
[7.7 2.8 6.7 2. ]
[6.3 2.7 4.9 1.8]
[6.7 3.3 5.7 2.1]
[7.2 3.2 6. 1.8]
[6.2 2.8 4.8 1.8]
[6.1 3. 4.9 1.8]
[6.4 2.8 5.6 2.1]
[7.2 3. 5.8 1.6]
[7.4 2.8 6.1 1.9]
[7.9 3.8 6.4 2. ]
[6.4 2.8 5.6 2.2]
[6.3 2.8 5.1 1.5]
[6.1 2.6 5.6 1.4]
[7.7 3. 6.1 2.3]
[6.3 3.4 5.6 2.4]
[6.4 3.1 5.5 1.8]
[6. 3. 4.8 1.8]
[6.9 3.1 5.4 2.1]
[6.7 3.1 5.6 2.4]
[6.9 3.1 5.1 2.3]
[5.8 2.7 5.1 1.9]
[6.8 3.2 5.9 2.3]
[6.7 3.3 5.7 2.5]
[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
Es kann bestätigt werden, dass die Anzahl der Datenproben 150 beträgt und die Merkmalsmenge die Dimension 4 beträgt. y hat das Beurteilungsergebnis des Klassifizierungsziels. Dies ist auch 150 Stück.
print(X.shape)
print(y.shape)
Ergebnis
(150, 4)
(150,)
Ziele sind ** nicht ** Iris virginica (2) **, nur zwei Arten von Iris setosa (0) und Iris versicolor (1) werden klassifiziert.
#Die Merkmalsmenge ist die Länge des äußeren Blumenstücks(sepal length)Und Breite(sepal width)von
#Begrenzt auf nur 2(In zwei Dimensionen denken)
X = X[:,:2]
#Ziel ist 2(iris virginica)Nicht, 2 Arten Iris Setosa(0)Und Iris versicolor(1)
#Nur für(Teilen Sie den Bereich in zwei Teile)
X = X[Target!=2]
Target = Target[Target!=2]
#Support Vector Machine für die Klassifizierung(Support Vector Classifier)Bereiten
clf = svm.SVC(C=1.0, kernel='linear')
#Optimierte Anpassung an Ihre Daten
clf.fit(X, Target)
#####Zeigen Sie das Klassifizierungsergebnis durch Farbcodierung des Hintergrunds an
#Länge des äußeren Blütenstücks(sepal length)Und Breite(sepal width)Mindestwert von
#Der vom Maximalwert um 1 erweiterte Bereich wird als Grafikanzeigebereich verwendet.
#So etwas wie Display-Tipps
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
Target_min = min(X[:,1]) - 1
Target_max = max(X[:,1]) + 1
#Teilen Sie den Grafikanzeigebereich vertikal und horizontal in Raster von 500 ein
# (Färben des Hintergrunds gemäß der Klassifizierungsklasse)
XX, YY = np.mgrid[x_min:x_max:500j, Target_min:Target_max:500j]
#Scikit zeigt auf das Gitter-Zum Lernen neu anordnen
Xg = np.c_[XX.ravel(), YY.ravel()]
#Die Klasse, zu der die Punkte jedes Gitters gehören(0 oder 1)Die Vorhersage wird in Z gespeichert
Z = clf.predict(Xg)
#Ordnen Sie Z im Raster neu an
Z = Z.reshape(XX.shape)
#Klasse 0(iris setosa)Ist hellorange(1, 0.93, 0.5, 1)
#Klasse 1(iris versicolor)Ist hellblau(0.5, 1, 1, 1)
cmap01 = ListedColormap([(0.5, 1, 1, 1), (1, 0.93, 0.5, 1)])
#Hintergrundfarbe anzeigen
plt.pcolormesh(XX, YY, Z==0, cmap=cmap01)
#Achsenbeschriftung einstellen
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Zeigen Sie Datenpunkte entsprechend dem Ziel in Farben an
# iris setosa (Target=0)Extrahieren Sie nur die Daten von
Xc0 = X[Target==0]
# iris versicolor (Target=1)Extrahieren Sie nur die Daten von
Xc1 = X[Target==1]
#Zeichnen Sie die Daten Xc0 der Iris setosa
plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
#Zeichnen Sie die Versicolor-Daten der Iris Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')
#Holen Sie sich Support-Vektor
SV = clf.support_vectors_
#Support-Vektor visualisieren
# plt.scatter(SV[:, 0], SV[:, 1],
# s=100, facecolors='none', edgecolors='k')
#Zeigt einen roten Rand für Punkte im Unterstützungsvektor an
#plt.scatter(SV[:,0], SV[:,1], c=(0,0,0,0), linewidths=1.0, edgecolors='red')
plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Zeigen Sie das gezeichnete Diagramm an
plt.show()
Die Ziele werden als 2 ** nicht Iris setosa (0) **, nur 2 Typen (Iris virginica) und Iris versicolor (1) klassifiziert.
#Laden Sie neu und machen Sie das nächste:
#Laden Sie die Irisdaten und speichern Sie sie in der variablen Iris.
iris = datasets.load_iris()
#Speichern Sie die Features in Variable X und das Ziel in Variable y
X = iris.data
y = iris.target
#Die Merkmalsmenge ist die Länge des äußeren Blumenstücks(sepal length)Und Breite(sepal width)von
#Begrenzt auf nur 2(In zwei Dimensionen denken)
X = X[:,:2]
#Ziel ist 0(iris setosa)Nicht,
#Mit anderen Worten, Iris versicolor(1)Und Iris virginica(2)Nur für
# (Teilen Sie den Bereich in zwei Teile)
X = X[y!=0]
y = y[y!=0]
#Bereiten Sie eine Support-Vektor-Maschine für die Klassifizierung vor
clf = svm.SVC(C=1.0, kernel='linear')
#Für Daten optimiert
clf.fit(X, y)
#####Zeigen Sie das Klassifizierungsergebnis durch Farbcodierung des Hintergrunds an
#Länge des äußeren Blütenstücks(sepal length)Und Breite(sepal width)von
#Die Fläche wurde vom Minimalwert und vom Maximalwert um 1 erweitert
#Als Grafikanzeigebereich verwenden
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
y_min = min(X[:,1]) - 1
y_max = max(X[:,1]) + 1
#Teilen Sie den Grafikanzeigebereich vertikal und horizontal in Raster von 500 ein
# (Färben des Hintergrunds gemäß der Klassifizierungsklasse)
XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]
#Scikit zeigt auf das Gitter-Zum Lernen neu anordnen
Xg = np.c_[XX.ravel(), YY.ravel()]
#Die Klasse, zu der die Punkte jedes Gitters gehören(1 oder 2)Die Vorhersage wird in Z gespeichert
Z = clf.predict(Xg)
#Ordnen Sie das Raster neu an
Z = Z.reshape(XX.shape)
#Die Hintergrundfarbe wird je nach Typ geändert
#Klasse 1(iris versicolor)Ist hellblau(0.5, 1, 1, 1)
#Klasse 2(iris setosa)Ist hellgrün(0.5, 0.75, 0.5, 1)
cmap12 = ListedColormap([(0.5, 0.75, 0.5, 1), (0.5, 1, 1, 1)])
#Ändern Sie die Hintergrundfarbanzeige in einen zweifarbigen Campus aus Hellblau und Hellgrün
plt.pcolormesh(XX, YY, Z==1, cmap=cmap12)
#Achsenbeschriftungssatz Japanisch kann leider nicht verwendet werden
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Zeigen Sie Datenpunkte entsprechend dem Ziel in Farben an
# iris versicolor (y=1)Extrahieren Sie nur die Daten von
Xc1 = X[y==1]
# iris virginica (y=2)Extrahieren Sie nur die Daten von
Xc2 = X[y==2]
#Zeichnen Sie die Versicolor-Daten der Iris Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9',linewidth=0.5, edgecolors='black')
#Zeichnen Sie die Daten von Iris virginica Xc2
plt.scatter(Xc2[:,0], Xc2[:,1], c='#008000',linewidth=0.5, edgecolors='black')
#Holen Sie sich Support-Vektor
SV = clf.support_vectors_
#Zeigt einen roten Rand für Punkte im Unterstützungsvektor an
plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Zeigen Sie das gezeichnete Diagramm an
plt.show()
Erhöhen wir die Anzahl der Klassen um 1 bis 3, während wir die Funktionen beibehalten. Es klassifiziert Iris setosa (0), Iris versicolor (1) und Iris virginica (2). Standardmäßig klassifiziert scikit-learn nach einer anderen Methode (one-vs-the-rest, ovr).
#Laden Sie Irisdaten und speichern Sie sie in einer variablen Iris
iris = datasets.load_iris()
#Speichern Sie die Features in Variable X und das Ziel in Variable y
X = iris.data
y = iris.target
#Die Merkmalsmenge ist die Länge des äußeren Blumenstücks(sepal length)Und Breite(sepal width)von
#Begrenzt auf nur 2(In zwei Dimensionen denken)
X = X[:,:2]
#Bereiten Sie eine Support-Vektor-Maschine für die Klassifizierung vor
clf = svm.SVC(C=1.0, kernel='linear', decision_function_shape='ovr')
# 'auto'Wenn Sie 1 angeben/(Abmessungen)Ist eingestellt. In diesem Fall 1/2=0.5
#clf = svm.SVC(C=1.0, kernel='rbf', gamma='auto', decision_function_shape='ovr')
#Wenn das Gamma erhöht wird, wird es zu einer Grenze mit einer großen Krümmung (Bohrlochbiegungen).
#clf = svm.SVC(C=1.0, kernel='rbf', gamma=1.0, decision_function_shape='ovr')
#Für Daten optimiert
clf.fit(X, y)
#####Zeigen Sie das Klassifizierungsergebnis durch Farbcodierung des Hintergrunds an
#Länge des äußeren Blütenstücks(sepal length)Und Breite(sepal width)von
#Die Fläche wurde vom Minimalwert und vom Maximalwert um 1 erweitert
#Als Grafikanzeigebereich verwenden
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
y_min = min(X[:,1]) - 1
y_max = max(X[:,1]) + 1
#Teilen Sie den Grafikanzeigebereich vertikal und horizontal in Raster von 500 ein
# (Färben des Hintergrunds gemäß der Klassifizierungsklasse)
XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]
#Scikit zeigt auf das Gitter-Zum Lernen neu anordnen
Xg = np.c_[XX.ravel(), YY.ravel()]
#Die Klasse, zu der die Punkte jedes Gitters gehören(0~2)Die Vorhersage wird in Z gespeichert
Z = clf.predict(Xg)
#Ordnen Sie das Raster neu an
Z = Z.reshape(XX.shape)
#Klasse 0(iris setosa)Ist hellorange(1, 0.93, 0.5, 1)
#Klasse 1(iris versicolor)Ist hellblau(0.5, 1, 1, 1)
#Klasse 2(iris virginica)Ist hellgrün(0.5, 0.75, 0.5, 1)
cmap0 = ListedColormap([(0, 0, 0, 0), (1, 0.93, 0.5, 1)])
cmap1 = ListedColormap([(0, 0, 0, 0), (0.5, 1, 1, 1)])
cmap2 = ListedColormap([(0, 0, 0, 0), (0.5, 0.75, 0.5, 1)])
#Hintergrundfarbe anzeigen
plt.pcolormesh(XX, YY, Z==0, cmap=cmap0)
plt.pcolormesh(XX, YY, Z==1, cmap=cmap1)
plt.pcolormesh(XX, YY, Z==2, cmap=cmap2)
#Achsenbeschriftung einstellen
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Zeigen Sie Datenpunkte entsprechend dem Ziel in Farben an
# iris setosa (y=0)Extrahieren Sie nur die Daten von
Xc0 = X[y==0]
# iris versicolor (y=1)Extrahieren Sie nur die Daten von
Xc1 = X[y==1]
# iris virginica (y=2)Extrahieren Sie nur die Daten von
Xc2 = X[y==2]
#Zeichnen Sie die Daten Xc0 der Iris setosa
plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
#Zeichnen Sie die Versicolor-Daten der Iris Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')
#Zeichnen Sie die Daten von Iris virginica Xc2
plt.scatter(Xc2[:,0], Xc2[:,1], c='#008000', linewidths=0.5, edgecolors='black')
#Holen Sie sich Support-Vektor
SV = clf.support_vectors_
#Zeigt einen roten Rand für Punkte im Unterstützungsvektor an
plt.scatter(SV[:,0], SV[:,1], c=(0,0,0,0), linewidths=1.0, edgecolors='red')
#plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Zeigen Sie das gezeichnete Diagramm an
plt.show()
(Referenz) Verwendung der Farben des Plt.scatter-Streudiagramms Ich bekomme eine kleine Warnung, werde aber zu einem späteren Zeitpunkt untersuchen, wie transparent der rote Kreis ist.
Verwandte Seiten
Kapitel 1: Lineares Regressionsmodell [Kapitel 2: Nichtlineares Regressionsmodell] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Kapitel 3: Logistisches Regressionsmodell] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Kapitel 4: Hauptkomponentenanalyse] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Kapitel 5: Algorithmus 1 (k-Nachbarschaftsmethode (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Kapitel 6: Algorithmus 2 (k-Mittel)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Kapitel 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)
Recommended Posts