[PYTHON] Régression de processus gaussien utilisant GPy

Qu'est-ce que la régression de processus gaussien?

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/#

Dessiner une vraie fonction

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)

image.png

échantillonnage

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. image.png

Régression du processus gaussien

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. image.png

Dessiner un intervalle de confiance

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 image.png

x1 = 0 section transversale image.png

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.

Lorsque le nombre d'échantillons est augmenté

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

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

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.

Résumé

Un modèle de régression de processus gaussien a été construit à l'aide de GPy.

Recommended Posts

Régression de processus gaussien utilisant GPy
Retour en utilisant le processus gaussien
Régression de processus gaussien Implémentation Numpy et GPy
Processus gaussien
PRML Chapitre 6 Implémentation Python Gaussian Return
Retour du processus gaussien avec PyMC3 Notes personnelles
Processus gaussien avec pymc3
Méthode de régression linéaire utilisant Numpy
Traiter sur GPU en utilisant chainer.cuda.elementwise
Implémenter le processus gaussien dans Pyro
"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy
Traitement des insertions de table DB à l'aide de sqlalchemy
[Pour les débutants] Surveillance des processus à l'aide de cron