[PYTHON] Comparaison des fonctions du noyau GPy

Objectif Nous voyons souvent des cas d'utilisation de la fonction de base radiale (RBF) de GPy dans l'optimisation sur le net, mais il existe plusieurs autres fonctions du noyau. Même s'il y avait une explication mathématique pour ces fonctions, je ne pouvais pas comprendre comment les utiliser correctement, j'ai donc essayé de les comparer en les affichant dans un graphique avec les paramètres par défaut unidimensionnels. Il a été créé en référence au script de Quelques expériences de régression des processus gaussiens. J'ai juste essayé d'écrire les fonctions du noyau en parallèle.

environnement

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

scénario

# 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  #Lors de l'utilisation du notebook Jupyter

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()

Explication Lignes 16-30: Dans Description officielle de Gpy, recherchez «fonction de covariance» par mot-clé et trouvez une méthode qui semble fonctionner. Défini dans une dimension. Ligne 52: définissez la plage du graphique (axes) en bas à gauche (0,1,0,1) et en haut à droite (0,6,0,8). Ligne 71: Avec bbox_to_anchor = (1.05,1), placez la légende dans le coin supérieur droit, et avec borderaxespad = 0, placez la légende en dehors du graphique. bbox_to_anchor = (1,1) correspond au coin supérieur droit du graphique (axes).

résultat Figure_2020110704.png ** Figure 1** Sur la figure 1, celui ayant un pic proche de Y = 1 à X = 0 et ayant un pic proche de la distribution gaussienne est affiché sur la figure 1. Figure_2020110705.png ** Figure 2** L'exponentielle est la fonction la plus nette, mais à part cela, elle est similaire et il y a une différence de degré de concentration proche de 0 avec X = ± 2 comme limite.

** Conclusion personnelle ** Pour le moment, il semble préférable de créer un cadre d'optimisation avec RBF, de vérifier les résultats de l'opération de ce cadre plusieurs fois et de modifier la fonction du noyau comme il convient dans certains cas.

Recommended Posts

Comparaison des fonctions du noyau GPy
Ecrire une fonction de densité du noyau
Apprendre Python! Comparaison avec Java (fonction de base)