Ich habe kürzlich ["Gauß-Prozess und maschinelles Lernen"](https://www.amazon.co.jp/ Gauß-Prozess und maschinelles Lernen - Maschinelles Lernen Professional Series-Mochihashi-Earth / dp / 4061529269) gelesen, also in Python Ich habe versucht, es umzusetzen. Der Inhalt lautet "3.4.2 Berechnung der Gaußschen Prozessregression" in Kapitel 3. Hirsch ist ein Wahrzeichen. Es ist leicht zu verstehen und sehr zu empfehlen.
Um den Gaußschen Prozess in einem Wort zu erklären:
Bei Y = f (X) ** "Wenn der Eingang X ähnlich ist, ist auch der Ausgang Y ähnlich." **
Es ist ein Werkzeug zum mathematischen Ausdrücken der Eigenschaft.
Dieses Mal werden wir die "Gaußsche Prozessregression" implementieren, eine Regressionsanalyse unter Verwendung dieses Gaußschen Prozesses!
Hier erklären wir die folgenden Schritte.
Lineare Regression ↓ Ridge kehrt zurück ↓ Betrachten Sie die lineare Regression und die Gratregression mit der Gaußschen Verteilung (Wahrscheinlichkeitsverteilung). ↓ Gaußsche Prozessregression
Es gibt zwei Gründe, die oben genannten Schritte auszuführen.
** Erstens ist die Gaußsche Prozessregression ein nichtlineares Modell, das die Ridge-Regression erweitert. ** **. Daher ist es notwendig, die Ridge-Regression als Voraussetzung für das Verständnis der Gaußschen Prozessregression zu verstehen. Es ist unnötig zu erwähnen, dass es notwendig ist, die lineare Regression zu verstehen, die die Voraussetzung der Gratregression ist. Daher werde ich aus der linearen Regression der Hauptprämisse erklären. (Es ist wie "herumstürmen".)
** Zweitens erhält die Gaußsche Prozessregression den vorhergesagten Wert durch Abtasten aus der Gaußschen Verteilung (Wahrscheinlichkeitsverteilung). ** **. Wie ich später ausführlich erläutern werde, besteht der Hauptunterschied zwischen der Gaußschen Prozessregression und der Gratregression (oder linearen Regression) darin, dass sich die Streuung der zu untersuchenden Gaußschen Verteilung gemäß dem Gaußschen Prozess ändert. Daher habe ich es möglich gemacht zu verstehen, wie sich die Gaußsche Prozessregression von der Ridge-Regression (oder linearen Regression) unterscheidet, indem ich den Schritt der Vorhersage durch Abtasten aus der Gaußschen Verteilung auf die gleiche Weise in die Ridge-Regression (oder lineare Regression) eingefügt habe. ..
Beginnen wir als ersten Schritt zum Verständnis der Gaußschen Prozessregression mit einem Überblick über die lineare Regression.
Für die lineare Regression sei X die Eingabematrix, w der Koeffizientenvektor und y der Ausgabevektor.
y=Xw \\
s.t. \min_{x}|Y-Xw|^2
Kann durch die Formel ausgedrückt werden. zeigt die Einschränkungen der linearen Regression
** Minimieren Sie den quadratischen Fehler zwischen dem gemessenen Wert Y und dem vorhergesagten Wert (y =) Xw. ** **.
ist was es bedeutet.
Insbesondere kann durch Differenzieren dieser Beschränkung mit w die Lösung des Koeffizienten w erhalten werden.
w=(X^TX)^{-1}X^Ty
Die folgenden Ergebnisse können erhalten werden, indem tatsächlich eine lineare Regression durchgeführt wird.
Dieses Mal wurde die Vorhersage mit einer linearen Funktion gemacht, aber wenn die Eingabe X zu den Daten mit einem Wert höherer Ordnung wie Quadrat, Würfel usw. hinzugefügt wird, wird der vorhergesagte Wert auch mit einer Funktion hoher Ordnung wie einer quadratischen Funktion oder einer kubischen Funktion erhalten. kann auch tun.
Als nächstes kommt die Gratregression. Die Ridge-Regression ist eine lineare Regression mit zusätzlichen Einschränkungen.
y=Xw \\
s.t. \min_{x} |Y-Xw|^2 + \alpha|w|^2
Die durch s.t. dargestellte Randbedingung hat einen quadratischen (konstanten Vielfachen) Term des Koeffizientenvektors w. das ist,
Minimieren Sie den quadratischen Fehler zwischen dem gemessenen Wert Y und dem vorhergesagten Wert (y =) Xw. ** Außerdem sollte der Koeffizient w so klein wie möglich sein. ** **.
ist was es bedeutet.
Diese zusätzliche Einschränkung bietet zwei Vorteile.
Wenn der Koeffizient w der linearen Regression gefunden wird, ist die folgende inverse Matrix tatsächlich
(X^TX)^{-1}
Die Berechnung wurde unter der Annahme durchgeführt, dass
Wenn diese inverse Matrix nicht existiert, besteht daher der Nachteil, dass eine Berechnung unmöglich wird.
Daher wird bei der Gratregression durch Hinzufügen des quadratischen (konstanten Mehrfach-) Terms des Koeffizientenvektors w zur Randbedingung, wenn die Randbedingung wie im Fall der linearen Regression durch w differenziert wird,
w=(X^TX + \alpha I)^{-1}X^Ty
Daher erzeugt die Einheitsmatrix αI absichtlich eine inverse Matrix, die die Berechnung ermöglicht.
Wie ich zuvor erklärt habe, kann die lineare Regression auch mit Funktionen höherer Ordnung vorhergesagt werden, so dass die Regressionsgleichung möglicherweise zu kompliziert wird und dieses Phänomen als Überlernen gelesen wird.
Wie die Grafik zeigt, ist es daher bei der Gratregression möglich, ein Überlernen bei der Berechnung des vorhergesagten Werts zu verhindern, indem der Koeffizient absichtlich auf einen kleinen Wert begrenzt wird.
Wenn die bisher beschriebene lineare Regression und Gratregression tatsächlich verwendet werden, werden der vorhergesagte Wert y und der gemessene Wert Y verwendet Es wird einen Fehler zwischen ihnen geben.
Mit anderen Worten, wenn man bedenkt, dass "Vorhersagefehler auftritt", ist der vorhergesagte Wert y bei einem bestimmten x eine Gaußsche Verteilung.
N(w^Tx, \sigma ^2)
Es kann gesagt werden, dass es nach abgetastet wird.
Hier wurden die Koeffizienten w der linearen Regression und der Gratregression bereits erhalten. Wenn sie also transformiert werden,
Lineare Regression
N \Bigl(\bigl((X^TX)^{-1}X^Ty \bigr)^Tx, \sigma ^2 \Bigr)
Ridge kehrt zurück
N \Bigl(\bigl((X^TX + \alpha I)^{-1}X^Ty \bigr)^Tx, \sigma ^2 \Bigr)
Durch Abtasten von kann jeder vorhergesagte Wert y erhalten werden.
Der Punkt, den Sie hier beachten sollten, ist
** Der Mittelwert der Gaußschen Verteilung unterscheidet sich zwischen linearer Regression und Gratregression. ** **.
** Die Varianz bleibt jedoch gleich, wobei beide von "gleicher Varianz" ausgehen. ** **.
Das ist der Punkt.
Abschließend werde ich die Gaußsche Prozessregression erklären!
Die Gaußsche Prozessregression wird zur Gratregression
** "Wenn der Eingang X ähnlich ist, ist auch der Ausgang Y ähnlich." **
Das Merkmal des Gaußschen Prozesses wird als Randbedingung hinzugefügt.
Mit anderen Worten, wenn der vorhergesagte Wert y der Gaußschen Prozessregression auch als ein Wert betrachtet wird, der durch Abtasten aus einer bestimmten Gaußschen Verteilung erhalten wird, wie in der zuvor erwähnten linearen Regression und Gratregression,
Die Gaußsche Verteilung, der die Gaußsche Prozessregression folgt, ist
** Nimmt nicht "gleiche Streuung" wie Gratregression an, **
** Die Varianz der vorhergesagten Werte y, y'ändert sich entsprechend dem Abstand (dh ob sie ähnlich sind) der Eingaben x, x '. ** **.
Das kann man sagen.
Lassen Sie uns vor diesem Hintergrund die Gaußsche Verteilung überprüfen, der die Gaußsche Prozessregression folgt.
N(k_*^TK^{-1}y, k_{**}-k_*^TK^{-1}k_*)
Hier kamen unbekannte k und K heraus.
Diese k und K werden als Kernel bezeichnet und sind "Werte, die von zwei Eingängen x erhalten werden".
Ich werde später im Detail erklären, aber hier
K: Kernel, erhalten aus Eingabe x zwischen Trainingsdaten k *: Kernel, erhalten aus Eingabe x der Trainingsdaten und Eingabe x der Testdaten k **: Kernel aus Eingabe x zwischen Testdaten
Weil der Durchschnitt und die Varianz der Gaußschen Verteilung, der die Gaußsche Prozessregression folgt, einen der oben genannten Kernel enthält.
** Positionsbeziehungen zwischen verschiedenen Eingaben x beeinflussen sowohl den Mittelwert als auch die Varianz der Gaußschen Verteilung, der die Gaußsche Prozessregression folgt. ** **.
Sie können sehen, dass.
Bereiten Sie diesmal die folgenden Daten vor.
Originaldaten: Künstlich erzeugtes gemischtes Signal mit Rauschen Trainingsdaten: Zufällige Stichprobenpunkte, die teilweise aus den Originaldaten erhalten wurden Vorhersagedaten: Ursprüngliches verrauschtes gemischtes Signal
import numpy as np
#Erstellung von Originaldaten
n=100
data_x = np.linspace(0, 4*np.pi, n)
data_y = 2*np.sin(data_x) + 3*np.cos(2*data_x) + 5*np.sin(2/3*data_x) + np.random.randn(len(data_x))
#Fehlt das Signal, um Teilabtastpunkte zu erhalten
missing_value_rate = 0.2
sample_index = np.sort(np.random.choice(np.arange(n), int(n*missing_value_rate), replace=False))
Lassen Sie uns nun mit Pyplot von Matplotlib überprüfen.
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(12, 5))
plt.title('signal data', fontsize=20)
#Originalsignal
plt.plot(data_x, data_y, 'x', color='green', label='correct signal')
#Teilprobenpunkte
plt.plot(data_x[sample_index], data_y[sample_index], 'o', color='red', label='sample dots')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12)
plt.show()
Die Ergebnisse sind wie folgt.
Es sind ziemlich komplizierte Daten, aber wie sagt man den Gaußschen Prozess voraus ... (ein wenig unruhig.)
Der Kernel kam plötzlich hier raus, aber um es grob zu erklären,
** Finden Sie die Kovarianzmatrix der Gaußschen Prozessregression, ohne den Koeffizientenvektor w zu berechnen **
Es ist ein Werkzeug.
Zuvor habe ich erklärt, dass der Gaußsche Prozess "Gratregression mit Mittelwert und Varianz im vorhergesagten Wert y" ist.
Zusätzlich werden dieser Mittelwert und diese Varianz aus der Beziehung berechnet, dass "wenn der Eingang X ähnlich ist, ist der Ausgang Y auch ähnlich" gemäß den Eigenschaften des Gaußschen Prozesses.
Wenn beispielsweise die Eingabe X eindimensionale Daten sind und das Intervall 1,0 von -10 bis 10 beträgt, wird der vorhergesagte Wert y (= xw) des Gaußschen Prozesses aus der Ähnlichkeit oder Positionsbeziehung der Eingabe X abgeleitet, so dass 21 y und der Koeffizient erhalten werden können. Der Vektor w hat 21 Dimensionen.
Wenn die Eingabe X zweidimensional ist, ersetzt der Koeffizientenvektor die Matrix und ihre Elemente erhöhen sich auf 441. Wenn Sie es auf 3D, 4D, ... erhöhen, werden die Elemente der Koeffizientenmatrix exponentiell erhöht, was zu einer großen Menge führt, die normalerweise nicht berechnet werden kann.
Zusätzlich zu den Abmessungen kann der Bereich des Eingangs X weiter erweitert werden, so dass dies für keine Rechenleistung ausreicht.
Hier kommt der Kernel ins Spiel.
Unter Verwendung des Kernels wird die Ähnlichkeit zwischen den beiden Ausgaben y, y, die direkt zwischen den beiden Eingaben x, x entspricht, direkt berechnet, ohne den Koeffizientenvektor (oder die Matrix) w zu berechnen, der für die Gaußsche Prozessregression erforderlich ist. Sie können eine kovariante Matrix finden!
Es gibt verschiedene Arten von Kerneln, aber dieses Mal werden wir den Gaußschen Kernel (RBF-Kernel) verwenden, der Gaußsche Fehler enthält.
Für den Gaußschen Kernel *** Werte fallen exponentiell ab wie eine Gaußsche Verteilung mit dem Abstand der Eingänge x, x '. *** Es gibt Funktionen wie.
Die Formel wird wie folgt ausgedrückt. Hier sind die Parameterwerte dieses Mal die folgenden drei. θ1, θ2: Gaußsche Kernelparameter θ3: Gaußsche Fehlerdispersion
Auch die Gaußsche Fehlerfunktion δ ist Zwei Eingabewerte x und x'sind gleich: δ (x, x ') = 1 Andere: δ (x, x ') = 0 Bedingte Verzweigung wie folgt.
Lassen Sie uns nun den Ausdruck als Funktion implementieren.
#Funktionalisieren Sie den Gaußschen Kernel
def kernel(x, x_prime, p, q, r):
if x == x_prime:
delta = 1
else:
delta = 0
return p*np.exp(-1 * (x - x_prime)**2 / q) + ( r * delta)
θ1, θ2, θ3 sind p, q, r x, x'is x, x_prime Es ist geworden.
Von hier aus werden wir gemäß Kapitel 3, "Abb. 3.17 Grundlegender Algorithmus für die Berechnung der Gaußschen Prozessregression" fortfahren.
Teilen Sie die zuvor erstellten Signaldaten gemäß der Notation im Buch vorerst in "Lerndaten" und "Testdaten" auf und definieren Sie sie auf leicht verständliche Weise neu.
#Datendefinition
xtrain = np.copy(data_x[sample_index])
ytrain = np.copy(data_y[sample_index])
xtest = np.copy(data_x)
Kommen wir nun zur Implementierung.
Hier die Gaußsche Verteilung, gefolgt von der zuvor vorgestellten Gaußschen Prozessregression
N(k_*^TK^{-1}y, k_{**}-k_*^TK^{-1}k_*)
Wir werden sowohl den Mittelwert als auch die Varianz bei der Verwendung des Gaußschen Kernels berechnen.
#durchschnittlich
mu = []
#Verteilt
var = []
#Jeder Parameterwert
Theta_1 = 1.0
Theta_2 = 0.4
Theta_3 = 0.1
#Weniger als,Grundlegender Algorithmus für die Berechnung der Gaußschen Prozessregression
train_length = len(xtrain)
#Bereiten Sie die Grundlage der Kernelmatrix zwischen den Trainingsdaten vor
K = np.zeros((train_length, train_length))
for x in range(train_length):
for x_prime in range(train_length):
K[x, x_prime] = kernel(xtrain[x], xtrain[x_prime], Theta_1, Theta_2, Theta_3)
#Das innere Produkt wird durch Punkte berechnet
yy = np.dot(np.linalg.inv(K), ytrain)
test_length = len(xtest)
for x_test in range(test_length):
#Bereiten Sie die Grundlage der Kernelmatrix zwischen Testdaten und Trainingsdaten vor
k = np.zeros((train_length,))
for x in range(train_length):
k[x] = kernel(xtrain[x], xtest[x_test], Theta_1, Theta_2, Theta_3)
s = kernel(xtest[x_test], xtest[x_test], Theta_1, Theta_2, Theta_3)
#Berechnen Sie das innere Produkt mit Punkten,Zum Array von Durchschnittswerten hinzufügen
mu.append(np.dot(k, yy))
#Erstens "k* K^-1 Teil(Da es ein inneres Produkt ist, ist es ein Punkt)Berechnung
kK_ = np.dot(k, np.linalg.inv(K))
#Berechnen Sie das innere Produkt mit der zweiten Hälfte mit Punkten,Zum verteilten Array hinzufügen
var.append(s - np.dot(kK_, k.T))
Es ist ein bisschen lang, also werde ich es der Reihe nach erklären.
Das erste, was wir diesmal tun möchten, ist der vorhergesagte Mittelwert und die Varianz des Signals. (Da das Intervall der vorhergesagten Werte mit den Originaldaten übereinstimmt, werden 100 Durchschnittswerte und Abweichungen in der Liste gespeichert.)
Geben Sie außerdem zuerst den Parameterwert an.
Der Inhalt des Algorithmus entspricht dem des Buches, bei der Implementierung in Python sind jedoch die folgenden Änderungen erforderlich.
Wenn Sie die oben genannten Punkte berücksichtigen, ist die Gaußsche Prozessregression perfekt!
Lassen Sie uns abschließend mit Pyplot von Matplotlib überprüfen.
plt.figure(figsize=(12, 5))
plt.title('signal prediction by Gaussian process', fontsize=20)
#Originalsignal
plt.plot(data_x, data_y, 'x', color='green', label='correct signal')
#Teilprobenpunkte
plt.plot(data_x[sample_index], data_y[sample_index], 'o', color='red', label='sample dots')
#Varianz in Standardabweichung umrechnen
std = np.sqrt(var)
#Signalisieren Sie den im Gaußschen Prozess erhaltenen Durchschnittswert
plt.plot(xtest, mu, color='blue', label='mean by Gaussian process')
#Bereich die Standardabweichung, die im Gaußschen Prozess erhalten wird*Reichweite siehe Codeende
plt.fill_between(xtest, mu + 2*std, mu - 2*std, alpha=.2, color='blue', label= 'standard deviation by Gaussian process')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12)
plt.show()
#Durchschnittswert ±(Standardabweichung x 2) … 95.4%Der angegebene Zahlenwert erscheint im Bereich mit der Wahrscheinlichkeit von
Die Ergebnisse sind wie folgt.
Wie im Code erwähnt, wird diesmal die vorhergesagte Varianz in die Standardabweichung umgewandelt. Zusätzlich wurde die doppelte Standardabweichung als erwarteter Bereich des Gaußschen Prozesses festgelegt.
Reichweite | Wahrscheinlichkeit, dass die angegebene Anzahl im Bereich erscheint |
---|---|
Mittelwert ± Standardabweichung | 68.3% |
Durchschnittswert ±(Standardabweichung x 2) | 95.4% |
Durchschnittswert ±(Standardabweichung x 3) | 99.7% |
Die Gaußsche Prozessregression hat zwei Hauptvorteile **.
Bei der linearen Regression und der Ridge-Regression wurde beim Erstellen eines nichtlinearen Modells die Vorbereitung und das Erlernen mehrerer Funktionen n-ter Ordnung unterstützt. Daher wird ** "welche Reihenfolge der Funktion berücksichtigt werden sollte" ** zu einem Engpass, und es müssen erhebliche Anstrengungen für den Modellbau unternommen werden.
Bei der Gaußschen Prozessregression können Sie mit ** "Verwenden des Kernels" ein nichtlineares Modell erhalten, ohne eine Funktion n-ter Ordnung vorzubereiten. ** **.
Daher sind der Berechnungsprozess und der Algorithmus zum Lernen kompliziert, aber es ist möglich, mit geringem Aufwand ein kompliziertes Modell zu erstellen.
Indem wir den Graphen der Gaußschen Prozessregression beobachten, der durch frühere Implementierung des Algorithmus erhalten wurde, können wir die ungefähren Eigenschaften der Originaldaten erfassen, aber aufgrund der Natur des Gaußschen Prozesses ** Orte, an denen der Stichprobenpunktabstand groß ist (horizontale Achse: 8) (In der Nähe usw.) ** ist völlig falsch.
Solche ** falsch vorhergesagten Teile haben jedoch eine größere "Streuung" als andere Teile **, und es scheint, dass der Gaußsche Prozess selbst gesteht, dass er nicht zuversichtlich in die Vorhersage ist.
Mit anderen Worten, der Gaußsche Prozess ist ** ein Modell, das die partielle Vorhersagegenauigkeit ** bestätigen kann.
["Gauß-Prozess und maschinelles Lernen"](https://www.amazon.co.jp/ Gauß-Prozess und maschinelles Lernen - Maschinelles Lernen Professional Series-Mochihashi-Earth / dp / 4061529269) Lassen Sie uns das Überlernen der linearen Regression-Ridge-Regression und der Lasso-Regression unterdrücken- to-kei.net -Statistik für die ganze Menschheit-
Recommended Posts