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/#
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)
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.
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ß.
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
x1 = 0 Querschnitt
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.
n_sample = 40
n_sample = 100
Wenn die Anzahl der Abtastungen zunimmt, wird die Breite des Konfidenzintervalls enger und die Variation der Regressionsergebnisse wird kleiner.
Ein Gaußsches Prozessregressionsmodell wurde unter Verwendung von GPy konstruiert.
Recommended Posts