Basé sur la sortie y``` correspondant à l'entrée`
x``` qui a déjà été échantillonnée
Créez un modèle de régression qui renvoie la valeur attendue et la variance des prédictions de sortie y '' 'pour la nouvelle entrée
x' ''.
Il est utilisé pour prédire la forme réelle d'une fonction à partir d'un nombre limité de points d'échantillonnage.
https://jp.mathworks.com/help/stats/gaussian-process-regression-models.html
Pour travailler avec le modèle de régression de processus gaussien, nous utilisons une bibliothèque python appelée GPy. https://gpy.readthedocs.io/en/deploy/#
Soit les entrées bidimensionnelles, et supposons que la fonction vraie est la somme des valeurs passées par la fonction cosinus.
temp.py
import numpy as np
#Définition des fonctions
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)
#dessin
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)
La séquence Sobol, l'échantillonnage en hypercube latin, etc. sont disponibles comme méthodes d'échantillonnage sans déchets. Nous ne les utilisons pas, et ici nous déterminons simplement au hasard les points d'échantillonnage. Le nombre de points d'échantillonnage doit être de 20 au début.
temp.py
import random
random.seed(1)
#Échantillonnage aléatoire
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))
#dessin
ax1.scatter(Xa_rand, Ya_rand)
Tracez les points d'échantillonnage dans la figure précédente. La moitié inférieure est encore meilleure, mais la moitié supérieure a peu d'échantillons et est spongieuse.
Construisez un modèle de régression de processus gaussien.
GPy.Sélectionnez une fonction du noyau avec kern. Ici, il s'agit d'un noyau RBF bidimensionnel.
#### **`GPy.models.Créer un modèle de régression avec GPRegression et model.Ajustez les paramètres du modèle avec Optimize.`**
temp.py
import GPy
#Données d'entraînement
Input = np.stack([Xa_rand, Ya_rand], axis=1)
Output = Za_rand[:,None]
#Construire un modèle de régression de processus gaussien
kernel = GPy.kern.RBF(2)
model = GPy.models.GPRegression(Input, Output, kernel)
model.optimize(messages=True, max_iters=1e5)
#dessin
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")
Tracez la surface de réponse. Bien que le score soit assez faible à 20 points, une vallée de montagne étonnamment rugueuse a été reproduite. L'erreur dans la moitié supérieure est importante.
Fixez l'une des entrées bidimensionnelles à 0 et regardez la section transversale de la surface de réponse.
temp.py
# x2=0 section transversale
model.plot(fixed_inputs=[(1, 0)])
plt.xlim(-1,1)
plt.ylim(-4,4)
plt.xlabel("x1")
# x1=0 section transversale
model.plot(fixed_inputs=[(0, 0)])
plt.xlim(-1,1)
plt.ylim(-4,4)
plt.xlabel("x2")
x2 = 0 section transversale
x1 = 0 section transversale
La bande bleu clair montre l'intervalle de confiance de 2,5 à 97,5%. Plus l'intervalle de confiance est large, plus la variation des résultats de la régression est grande. Il semble qu'il ne soit pas confiant dans la grande partie de x2.
n_sample = 40
n_sample = 100
Au fur et à mesure que le nombre d'échantillons augmente, la largeur de l'intervalle de confiance se rétrécit et la variation des résultats de la régression diminue.
Un modèle de régression de processus gaussien a été construit à l'aide de GPy.
Recommended Posts