Zweck Wir sehen oft Fälle, in denen die Radial Basis Function (RBF) von GPy bei der Optimierung im Netz verwendet wird, aber es gibt mehrere andere Kernelfunktionen. Obwohl es eine mathematische Erklärung für diese Funktionen gab, konnte ich nicht herausfinden, wie man sie richtig verwendet, und versuchte, sie zu vergleichen, indem ich sie in einem Diagramm mit den eindimensionalen Standardeinstellungen anzeigte. Es wurde unter Bezugnahme auf das Skript von Einige Experimente zur Regression von Gaußschen Prozessen erstellt. Ich habe gerade versucht, die Kernelfunktionen parallel zu schreiben.
Umgebung
Item | Content |
---|---|
Hardware | Jetson Nano |
SDK | Jetpack 4.2.3 |
OS | Ubuntu 18.04 |
Python | Ver. 3.6.9 |
GPy | Ver. 1.9.9 |
matplotlib | Ver. 3.2.2 |
numpy | Ver. 1.19.2 |
Skript
# Support for maths
import numpy as np
# Plotting tools
from matplotlib import pyplot as plt
# we use the following for plotting figures in jupyter
#%matplotlib inline #Bei Verwendung des Jupyter-Notebooks
import warnings
warnings.filterwarnings('ignore')
# GPy: Gaussian processes library
import GPy
#from IPython.display import display
# Create a 1-D RBF kernel with default parameters
k01 = GPy.kern.RBF(1)
k02 = GPy.kern.Matern32(1)
k03 = GPy.kern.Matern52(1)
k04 = GPy.kern.ExpQuad(1)
k05 = GPy.kern.RatQuad(1)
k06 = GPy.kern.Exponential(1)
k07 = GPy.kern.Cosine(1)
k08 = GPy.kern.White(1)
k09 = GPy.kern.Linear(1)
k10 = GPy.kern.sde_Brownian(1)
k11 = GPy.kern.Integral(1)
k12 = GPy.kern.Poly(1)
k13 = GPy.kern.Bias(1)
k14 = GPy.kern.StdPeriodic(1)
k15 = GPy.kern.PeriodicExponential(1)
# Our sample space: 100 samples in the interval [-4,4]
X = np.linspace(-4.,4.,100)[:, None] # we need [:, None] to reshape X into a column vector for use in GPy
# First, sample kernel at x' = 0
K01 = k01.K(X, np.array([[0.]])) # k(x,0)
K02 = k02.K(X, np.array([[0.]])) # k(x,0)
K03 = k03.K(X, np.array([[0.]])) # k(x,0)
K04 = k04.K(X, np.array([[0.]])) # k(x,0)
K05 = k05.K(X, np.array([[0.]])) # k(x,0)
K06 = k06.K(X, np.array([[0.]])) # k(x,0)
K07 = k07.K(X, np.array([[0.]])) # k(x,0)
K08 = k08.K(X, np.array([[0.]])) # k(x,0)
K09 = k09.K(X, np.array([[0.]])) # k(x,0)
K10 = k10.K(X, np.array([[0.]])) # k(x,0)
K11 = k11.K(X, np.array([[0.]])) # k(x,0)
K12 = k12.K(X, np.array([[0.]])) # k(x,0)
K13 = k13.K(X, np.array([[0.]])) # k(x,0)
K14 = k14.K(X, np.array([[0.]])) # k(x,0)
K15 = k15.K(X, np.array([[0.]])) # k(x,0)
plt.axes([0.1, 0.1, 0.6, 0.8])
plt.plot(X, K01, label="RBF")
plt.plot(X, K02, label="Matern32")
plt.plot(X, K03, label="Matern52")
plt.plot(X, K04, label="ExpQuad")
plt.plot(X, K05, label="RatQuad")
plt.plot(X, K06, label="Exponential")
plt.plot(X, K07, label="Cosine")
plt.plot(X, K08, label="White")
plt.plot(X, K09, label="Linear")
plt.plot(X, K10, label="sde_Brownian")
plt.plot(X, K11, label="Integral")
plt.plot(X, K12, label="Poly")
plt.plot(X, K13, label="Bias")
plt.plot(X, K14, label="StdPeriodic")
plt.plot(X, K15, label="PeriodicExponential")
plt.title("$\kappa_{Covariance Function}(x,x')$");
plt.legend(bbox_to_anchor=(1.05,1), loc='upper left', borderaxespad=0, fontsize=8)
plt.show()
Erläuterung Zeilen 16-30: Suchen Sie in Offizielle Gpy-Beschreibung nach "Kovarianzfunktion" anhand des Schlüsselworts und suchen Sie eine Methode, die zu funktionieren scheint. In einer Dimension definiert. Zeile 52: Stellen Sie den Diagrammbereich (Achsen) unten links (0,1,0,1) und oben rechts (0,6,0,8) ein. Zeile 71: Platzieren Sie mit bbox_to_anchor = (1.05,1) die Legende in der oberen rechten Ecke und mit borderaxespad = 0 die Legende außerhalb des Diagramms. bbox_to_anchor = (1,1) entspricht der oberen rechten Ecke des Diagramms (Achsen).
Ergebnis ** Abbildung 1** In Fig. 1 ist derjenige in Fig. 1 mit einem Peak nahe Y = 1 bei X = 0 und einem Peak nahe der Gaußschen Verteilung dargestellt. ** Figur 2** Exponential ist die schärfste Funktion, aber ansonsten ist sie ähnlich und es gibt einen Unterschied im Konzentrationsgrad nahe 0 mit X = ± 2 als Grenze.
** Persönliche Schlussfolgerung ** Derzeit scheint es besser, ein Optimierungsframework mit RBF zu erstellen, die Operationsergebnisse dieses Frameworks mehrmals zu überprüfen und in einigen Fällen die Kernelfunktion entsprechend zu ändern.