[PYTHON] Gaußsche Prozessregression mit GPy

Was ist die Gaußsche Prozessregression?

Basierend auf der Ausgabe `y```, die der Eingabe x``` entspricht, die bereits abgetastet wurde Erstellen Sie ein Regressionsmodell, das den erwarteten Wert und die Varianz der Ausgabevorhersagen "y" für die neue Eingabe "x" zurückgibt. Es wird verwendet, um die wahre Form einer Funktion aus einer begrenzten Anzahl von Abtastpunkten vorherzusagen. https://jp.mathworks.com/help/stats/gaussian-process-regression-models.html

Um mit dem Gaußschen Prozessregressionsmodell zu arbeiten, verwenden wir eine Python-Bibliothek namens GPy. https://gpy.readthedocs.io/en/deploy/#

Eine wahre Funktion zeichnen

Lassen Sie die Eingaben zweidimensional sein und nehmen Sie an, dass die wahre Funktion die Summe der Werte ist, die durch die Kosinusfunktion geleitet werden.

temp.py


import numpy as np

#Funktionsdefinition
def func(x):
    fx = np.sum(np.cos(2 * np.pi * x))
    return fx

xa = np.linspace(-1, 1, 101)
ya = np.linspace(-1, 1, 101)
Xa, Ya = np.meshgrid(xa, ya)

Za = np.zeros([101, 101])
for i in range(len(Xa)):
    for j in range(len(Ya)):
        x = np.array([Xa[i,j], Ya[i,j]])
        Za[i,j] = func(x)

#Zeichnung
import matplotlib.pyplot as plt
fig1 = plt.figure(figsize=(8,8))
ax1 = fig1.add_subplot(111)
ax1.contour(Xa, Ya, Za, cmap="jet", levels=10, alpha=1)
plt.xlim(-1,1)
plt.ylim(-1,1)

image.png

Probenahme

Sobol-Sequenz, Latin-Hypercube-Probenahme usw. stehen als Methoden zur Probenahme ohne Abfall zur Verfügung. Wir verwenden sie nicht und bestimmen hier einfach zufällig die Stichprobenpunkte. Die Anzahl der Stichprobenpunkte sollte zu Beginn 20 betragen.

temp.py


import random
random.seed(1)

#Stichproben
n_sample = 20
Xa_rand = [random.random()* 2 - 1 for i in range(n_sample)]
Ya_rand = [random.random()* 2 - 1 for i in range(n_sample)]

xlist = np.stack([Xa_rand, Ya_rand], axis=1)
Za_rand = []
for x in xlist:
    Za_rand = np.append(Za_rand, func(x))

#Zeichnung
ax1.scatter(Xa_rand, Ya_rand)

Zeichnen Sie die Beispielpunkte in der vorherigen Abbildung. Die untere Hälfte ist immer noch besser, aber die obere Hälfte hat wenige Proben und ist matschig. image.png

Gaußsche Prozessregression

Erstellen Sie ein Gaußsches Prozessregressionsmodell.

GPy.Wählen Sie eine Kernelfunktion mit Kern. Hier ist es ein zweidimensionaler RBF-Kernel.



#### **`GPy.models.Erstellen Sie ein Regressionsmodell mit GPRegression und Modell.Stimmen Sie die Modellparameter mit Optimieren ab.`**

temp.py


import GPy

#Trainingsdaten
Input = np.stack([Xa_rand, Ya_rand], axis=1)
Output = Za_rand[:,None]

#Erstellen Sie ein Gaußsches Prozessregressionsmodell
kernel = GPy.kern.RBF(2)
model = GPy.models.GPRegression(Input, Output, kernel)
model.optimize(messages=True, max_iters=1e5)

#Zeichnung
model.plot(levels=10)
plt.gcf().set_size_inches(8, 8, forward=True)
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("x1")
plt.ylabel("x2")

Zeichnen Sie die Antwortfläche. Obwohl die Punktzahl mit 20 Punkten recht niedrig war, wurde ein überraschend raues Gebirgstal reproduziert. Der Fehler in der oberen Hälfte ist groß. image.png

Konfidenzintervall zeichnen

Fixieren Sie eine der zweidimensionalen Eingaben auf 0 und sehen Sie sich den Querschnitt der Antwortfläche an.

temp.py


# x2=0 Querschnitt
model.plot(fixed_inputs=[(1, 0)])
plt.xlim(-1,1)
plt.ylim(-4,4)
plt.xlabel("x1")

# x1=0 Querschnitt
model.plot(fixed_inputs=[(0, 0)])
plt.xlim(-1,1)
plt.ylim(-4,4)
plt.xlabel("x2")

x2 = 0 Querschnitt image.png

x1 = 0 Querschnitt image.png

Das hellblaue Band zeigt das Konfidenzintervall von 2,5 bis 97,5%. Je breiter das Konfidenzintervall ist, desto größer ist die Variation der Regressionsergebnisse. Es scheint, dass er im großen Teil von x2 nicht zuversichtlich ist.

Wenn die Anzahl der Proben erhöht wird

n_sample = 40 image.png image.png image.png

n_sample = 100 image.png image.png image.png

Wenn die Anzahl der Abtastungen zunimmt, wird die Breite des Konfidenzintervalls enger und die Variation der Regressionsergebnisse wird kleiner.

Zusammenfassung

Ein Gaußsches Prozessregressionsmodell wurde unter Verwendung von GPy konstruiert.

Recommended Posts

Gaußsche Prozessregression mit GPy
Rückkehr nach dem Gaußschen Verfahren
Gaußsche Prozessregression Numpy Implementierung und GPy
Gaußscher Prozess
PRML Kapitel 6 Gaussian Return Python-Implementierung
Gaußscher Prozess kehrt mit PyMC3 Personal Notes zurück
Gaußscher Prozess mit pymc3
Lineare Regressionsmethode mit Numpy
Prozess auf GPU mit chainer.cuda.elementwise
Implementieren Sie den Gaußschen Prozess in Pyro
"Gauß-Prozess und maschinelles Lernen" Gauß-Prozessregression nur mit Python-Numpy implementiert
Verarbeitung von DB-Tabelleneinfügungen mit sqlalchemy
[Für Anfänger] Prozessüberwachung mit cron