Schritt für Schritt zur Theorie, Implementierung in Python und Analyse mit scikit-learn über den Algorithmus, der zuvor in "Klassifikation des maschinellen Lernens" verwendet wurde. Ich werde mit lernen. Ich schreibe es zum persönlichen Lernen, daher möchte ich, dass Sie alle Fehler übersehen.
Diesmal über ** Support Vector Machine **. Obwohl seine Geschichte alt ist, ist es eine beliebte Methode im Bereich des maschinellen Lernens. Es hat eine hohe Generalisierungsleistung und war der stärkste Algorithmus, bis es durch tiefes Lernen in ILSVRC2012 besiegt wurde. Ich finde es ziemlich gut, sich daran zu erinnern (Wortschatz).
Die folgenden Seiten wurden auf diese Zeit verwiesen. Vielen Dank. Es scheint, dass es viele andere gute Bücher gibt, also beziehen Sie sich bitte auch darauf.
Ich habe versucht, die Theorie gut zu verstehen, aber sie war sehr kompliziert, und es gab Eintrag, der die Theorie fester berührt. Ich werde nur die Essenz beschreiben.
Die Support Vector Machine ist ein überwachter binärer Klassifikator wie Perceptron und Logistic Regression. Durch die Einführung des Konzepts des Unterstützungsvektors ist es möglich, Klassifizierungsprobleme (XOR usw.) zu klassifizieren, die eine hohe Generalisierungsleistung für unbekannte Daten aufweisen und mit der Kernel-Methode nicht linear klassifiziert werden können. Grob gesagt scheint es ein Klassifikator zu sein, der Perceptron die Margin-Maximierung und die Kernel-Methode gebracht hat.
Stellen Sie sich eine Situation vor, in der für die folgenden beiden Merkmalsgrößen eine binäre Klassifizierung erforderlich ist. Der blaue Kreis und der rote Kreis sind die Trainingsdaten. Der blaue Punkt ist 1 (** positives Beispiel ) und der rote Punkt ist -1 ( negatives Beispiel **). Die am Rand gezeichnete grüne Linie sei
Das Problem bei Support-Vektor-Maschinen besteht darin, die Lehrerdaten nach $ a $ und $ b $ zu fragen, die diesen Spielraum maximieren. In Wirklichkeit sind diese Fälle nicht nur praktisch, sondern es gibt viele Fälle, in denen sie nicht richtig unterteilt sind, sondern wir werden zunächst diesen einfachen Fall betrachten.
Der Grund, warum die Support-Vektor-Maschine in verschiedenen Fällen gut klassifizieren kann, besteht darin, dass sie dank dieser Randmaximierung unbekannte Daten gut klassifiziert und bei Verwendung der Daten in der Nähe der Grenzfläche davon abweicht. Es scheint einen Punkt zu geben, der den Wert nicht sehr beeinflusst.
N Lehrerdaten $ \ boldsymbol {x} = (x_0, x_1, \ cdots, x_ {N-1}) $, Klassifizierungsbezeichnung $ \ boldsymbol {t} = (t_0, t_1, \ cdots, t_ { N-1}) $, der Grenzausdruck (als Diskriminanzfunktion bezeichnet) ist $ g (x) = \ boldsymbol {w} ^ Tx + w_0 $. $ \ Boldsymbol {w} $ ist ein Gewichtsvektor von $ \ boldsymbol {x} $.
Um die obige Gleichung zu maximieren, ist es umso besser, je kleiner der Nenner ist. Wenn er jedoch 0 erreicht, wird er unbestimmt (die Lösung kann nicht eindeutig bestimmt werden). Fügen Sie daher eine Einschränkung hinzu.
Unter der Annahme, dass $ g (x) = 1 $ im positiven Beispiel und $ g (x) = -1 $ im negativen Beispiel ist, ist
Organisieren,
Verwenden Sie eine Methode namens Lagranges unbestimmte Multiplikatormethode, um eine Funktion mit Einschränkungen wie der obigen Gleichung zu minimieren. Dies verwendet die Theorie, dass das Lösen des umgeschriebenen Problems das Lösen des ursprünglichen Problems bedeutet, das als ** duales Problem ** bezeichnet wird.
Einschränkungsausdruck
L(w,w_0,\lambda)=\frac{1}{2}|w|^2-\sum_{i=1}^{N}\lambda_i \{ t_i(\boldsymbol{w}^Tx_i+w_0)-1\}
Wenn Sie also ein partielles Differential für $ w $ und $ w_0 $ erstellen und das partielle Differential auf 0 setzen, ist die Lagrange-Funktion ein Ausdruck mit nur $ \ lambda $.
L(\lambda)=\sum_{n=1}^{N}\lambda_n-\frac{1}{2}\sum_{n=1}^{N}\sum_{m=1}^{N}\lambda_n\lambda_mt_nt_mx_n^Tx_m
Ist abgleitet. Die Einschränkung ist
\lambda_n\geq 0 \\
\sum_{i=1}^N\lambda_it_i=0
ist. Dies ersetzt das Problem, $ \ lambda $ zu finden, das $ L (\ lambda) $ maximiert.
Wenn die obige Gleichung teilweise durch $ w $ differenziert ist,
Jetzt, wo wir $ w $ haben, werden wir nach $ w_0 $ fragen.
t_n(\sum_{m} \lambda_mt_mx_mx_n+w_0)=1
Ist festgelegt. Eigentlich deformiert
w_0=\frac{1}{N_M}\sum_{n}(t_n-\sum_{m}\lambda_mt_mx_mx_n)
Fragen Sie als. Zusammenfassend lässt sich sagen, dass nach $ \ lambda $ gefragt wird
w=\sum_{i=1}^{N}\lambda_it_ix_i \\
w_0=\frac{1}{N_M}\sum_{n}(t_n-\sum_{m}\lambda_mt_mx_mx_n)
Wird endlich berechnet. Wie finden Sie das $ \ lambda $? Tatsächlich kann es mit einer Methode namens SMO (Sequential Minimal Optimization) berechnet werden.
SMO
Zuerst werde ich das zu lösende Problem erneut veröffentlichen.
L(\lambda)=\sum_{n=1}^{N}\lambda_n-\frac{1}{2}\sum_{n=1}^{N}\sum_{m=1}^{N}\lambda_n\lambda_mt_nt_mx_n^Tx_m \\
Einschränkungen
\lambda_n\geq 0 ,\sum_{i=1}^N\lambda_it_i=0
Somit kann das Problem der Maximierung des beschränkten $ L (\ lambda) $ unter Verwendung von SMO gefunden werden.
[Wikipedia](https://ja.wikipedia.org/wiki/%E9%80%90%E6%AC%A1%E6%9C%80%E5%B0%8F%E5%95%8F%E9%A1 Gemäß% 8C% E6% 9C% 80% E9% 81% A9% E5% 8C% 96% E6% B3% 95) wird SMO auf Japanisch als ** sequentielle Methode zur Optimierung minimaler Probleme ** bezeichnet. Nähert sich der Lösung wie der Gradientenmethode iterativ, wählt zwei beliebige Variablen aus und wiederholt sie, bis sie konvergieren. Diese beliebigen 2 Variablen werden als Arbeitssatz bezeichnet. Der Schlüssel ist die Auswahl dieser 2 Variablen.
Als Fluss,
Dieser Vorgang wird wiederholt, bis keine Variablen mehr vorhanden sind, die die KKT-Bedingungen verletzen.
Die Karush-Kuhn-Tucker-Bedingung, nachstehend die KKT-Bedingung genannt, bezieht sich auf die optimale Bedingung, die die Ableitung erster Ordnung erfüllen muss.
Tatsächlich wird die KKT-Bedingung auch in der obigen unbestimmten Lagrange-Multiplikatormethode verwendet.
(1)
Es ist eine Bedingung. Insbesondere wird die fünfte Bedingung als ** Komplementaritätsbedingung ** bezeichnet.
Komplementäre Bedingung
Wird abgeleitet, sodass Sie $ \ lambda $ auswählen können, das diese Anforderung nicht erfüllt. Nehmen wir umgekehrt an, dass eine Lösung gefunden wird, wenn $ \ lambda $ verschwindet. Lassen Sie $ \ lambda $, das hier ausgewählt wurde, $ \ lambda_1 $ sein.
Wählen Sie die andere Variable in der folgenden Reihenfolge aus. Zuerst müssen Sie $ \ boldsymbol {w} $ und $ w_0 $ im aktuellen $ \ lambda $ finden.
Die Fehlerfunktion zu diesem Zeitpunkt ist
Ich habe entschieden, welche $$ lambda_1 $ und $ \ lambda_2 $ aktualisiert werden sollen, aber es gibt eine lineare Einschränkung
\lambda_1^{new}t_1+\lambda_2^{new}t_2=\lambda_1t_1+\lambda_2t_2
Es wird sein. Dies ist unterteilt in den Fall von $ t_1 = t_2 $ und den Fall von $ t_1 \ ne t_2 $.
\lambda_1^{new}=\lambda_1+\frac{t_1(E_2-E_1)}{x_1^2+x_1x_2+x_2^2} \\
\lambda_2^{new}=\lambda_2+t_1t_2(\lambda_1-\lambda_1^{new})
Bekommen Eigentlich brauchten wir einen Prozess namens Clipping, um den möglichen Bereich von $ \ lambda_1 $ und $ \ lambda_2 $ zu finden, aber wir waren erschöpft.
Zuallererst habe ich die Theorie erschöpft und sie ist zu lange her, also werde ich einfach Scikit-Learn implementieren. Es tut uns leid. Ich werde es definitiv eines Tages selbst umsetzen.
Die Implementierung von Python ist ziemlich einfach. Unterstützung mit scikit-learn Verwenden Sie sklearn.svm.LinearSVC für die Klassifizierung von Vektormaschinen. .. Dieses Mal werden wir der Klarheit halber eine Stichprobe verwenden, in der 50 positive und 50 negative Beispiele richtig getrennt sind.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import svm
fig, ax = plt.subplots()
x1_1=np.ones(50)+10*np.random.random(50)
x1_2=np.ones(50)+10*np.random.random(50)
x2_1=-np.ones(50)-10*np.random.random(50)
x2_2=-np.ones(50)-10*np.random.random(50)
x1 = np.c_[x1_1,x1_2]
x2 = np.c_[x2_1,x2_2]
y = np.array(np.r_[np.ones(50), -np.ones(50)])
model = svm.LinearSVC()
model.fit(np.array(np.r_[x1,x2]), y)
ax.scatter(x1[:,0],x1[:,1],marker='o',color='g',s=100)
ax.scatter(x2[:,0],x2[:,1],marker='s',color='b',s=100)
w = model.coef_[0]
x_fig = np.linspace(-12.,12.,100)
y_fig = [-w[0]/w[1]*xi-model.intercept_/w[1] for xi in x_fig]
ax.plot(x_fig, y_fig)
plt.show()
Es wurde so klassifiziert. Es ist natürlich.
Ich bin am Ende erschöpft, aber ich denke, ich könnte die Atmosphäre erfassen (ich kann es nicht erfassen w). Dieses Mal haben wir die Grundlagen in den Grundlagen abgeleitet, die Beispiele (harter Rand), die linear trennbar sind und positive und negative Beispiele richtig klassifizieren können.
Für eine Support-Vektor-Maschine, die weiter fortgeschritten oder realitätsnaher ist, müssen Fälle berücksichtigt werden, in denen eine lineare Trennung nicht möglich ist (Kernel-Methode), und Fälle, in denen positive und negative Beispiele nicht richtig klassifiziert werden können (weicher Rand), sondern die grundlegende Theorie Ist fast das gleiche wie diesmal.
Ab dem nächsten Mal möchte ich mich mit diesem Bereich befassen.
** Ergänzung **: Geschrieben
Recommended Posts