J'ai récemment lu ["Gauss Process and Machine Learning"](https://www.amazon.co.jp/ Gauss Process and Machine Learning-Machine Learning Professional Series-Mochihashi-Earth / dp / 4061529269), donc en Python J'ai essayé de le mettre en œuvre. Le contenu est "3.4.2 Calcul de la régression du processus gaussien" au chapitre 3. Le cerf est un repère. Il est facile à comprendre et fortement recommandé.
Tout d'abord, pour expliquer le processus gaussien en un mot,
À Y = f (X) ** "Si l'entrée X est similaire, la sortie Y est également similaire." **
C'est un outil pour exprimer mathématiquement la propriété.
Cette fois, nous allons implémenter la "régression de processus gaussien" qui est une analyse de régression utilisant ce processus gaussien!
Ici, nous vous expliquerons en suivant les étapes suivantes.
Régression linéaire ↓ Retour de crête ↓ Considérons la régression linéaire et la régression des crêtes avec une distribution gaussienne (distribution de probabilité) ↓ Régression du processus gaussien
Il y a deux raisons de suivre les étapes ci-dessus.
** Premièrement, la régression de processus gaussien est un modèle non linéaire qui étend la régression Ridge. ** ** Par conséquent, il est nécessaire de comprendre la régression de Ridge comme une condition préalable à la compréhension de la régression du processus gaussien. Il va sans dire qu'il est nécessaire de comprendre la régression linéaire, qui est la prémisse de la régression par crête. Par conséquent, je vais expliquer à partir de la régression linéaire de la prémisse principale. (C'est comme "se précipiter".)
** Deuxièmement, la régression de processus gaussien obtient des valeurs prédites par échantillonnage à partir de la distribution gaussienne (distribution de probabilité). ** ** Comme je l'expliquerai en détail plus tard, la principale différence entre la régression de processus gaussien et la régression de crête (ou régression linéaire) est que la dispersion de la distribution gaussienne à échantillonner change selon le processus gaussien. Par conséquent, j'ai permis de comprendre en quoi la régression du processus gaussien diffère de la régression Ridge (ou régression linéaire) en insérant l'étape de prédiction par échantillonnage à partir de la distribution gaussienne de la même manière en régression par crête (ou régression linéaire). ..
Comme première étape dans la compréhension de la régression de processus gaussien, commençons par un examen de la régression linéaire.
Pour la régression linéaire, soit X la matrice d'entrée, w le vecteur de coefficient et y le vecteur de sortie.
y=Xw \\
s.t. \min_{x}|Y-Xw|^2
Il peut être exprimé par la formule. s.t. montre les contraintes de la régression linéaire
** Minimisez l'erreur quadratique entre la valeur mesurée Y et la valeur prédite (y =) Xw. ** **
est ce que cela signifie.
En particulier, en différenciant cette contrainte avec w, la solution du coefficient w peut être obtenue.
w=(X^TX)^{-1}X^Ty
Les résultats suivants peuvent être obtenus en effectuant effectivement une régression linéaire.
Cette fois, la prédiction a été faite avec une fonction linéaire, mais si l'entrée X est ajoutée aux données avec une valeur d'ordre élevé telle qu'un carré, un cube, etc., la valeur prédite est également obtenue avec une fonction d'ordre élevé telle qu'une fonction quadratique ou une fonction cubique. peut aussi faire.
Vient ensuite la régression des crêtes. La régression Ridge est une régression linéaire avec des contraintes supplémentaires.
y=Xw \\
s.t. \min_{x} |Y-Xw|^2 + \alpha|w|^2
La condition de contrainte représentée par s.t. a un terme carré (multiple constant) du vecteur de coefficient w. c'est,
Minimisez l'erreur quadratique entre la valeur mesurée Y et la valeur prédite (y =) Xw. ** De plus, le coefficient w doit être aussi petit que possible. ** **
est ce que cela signifie.
Cette contrainte supplémentaire offre deux avantages.
Lors de la recherche du coefficient w de la régression linéaire, la matrice inverse suivante est en fait
(X^TX)^{-1}
Le calcul a été fait sur l'hypothèse que
Par conséquent, si cette matrice inverse n'existe pas, le calcul devient impossible.
Par conséquent, dans la régression de crête, en ajoutant le terme carré (multiple constant) du vecteur coefficient w à la condition de contrainte, si la condition de contrainte est différenciée par w comme dans le cas de la régression linéaire,
w=(X^TX + \alpha I)^{-1}X^Ty
Par conséquent, la matrice unitaire αI crée intentionnellement une matrice inverse, ce qui rend le calcul possible.
Comme je l'ai expliqué précédemment, la régression linéaire peut être prédite même avec des fonctions d'ordre supérieur, de sorte que l'équation de régression peut devenir trop compliquée, et ce phénomène est interprété comme un surapprentissage.
Par conséquent, comme le montre le graphique, dans la régression par crêtes, il est possible d'éviter le surapprentissage lors du calcul de la valeur prédite en limitant intentionnellement le coefficient à une petite valeur.
Lorsque la régression linéaire et la régression de crête décrites jusqu'à présent sont effectivement utilisées, la valeur prédite y et la valeur mesurée Y Il y aura une erreur entre eux.
En d'autres termes, considérant qu'une "erreur de prédiction se produit", la valeur prédite y étant donné un certain x est une distribution gaussienne.
N(w^Tx, \sigma ^2)
On peut dire qu'il est échantillonné selon.
Ici, les coefficients w de la régression linéaire et de la régression de crête ont déjà été obtenus, donc s'ils sont transformés,
Régression linéaire
N \Bigl(\bigl((X^TX)^{-1}X^Ty \bigr)^Tx, \sigma ^2 \Bigr)
Retour de crête
N \Bigl(\bigl((X^TX + \alpha I)^{-1}X^Ty \bigr)^Tx, \sigma ^2 \Bigr)
En échantillonnant à partir de, chaque valeur prédite y peut être obtenue.
Le point que je voudrais que vous gardiez à l'esprit ici est
** La moyenne de la distribution gaussienne est différente entre la régression linéaire et la régression par crête. ** **
** Mais la variance reste la même, les deux supposant une «variance égale». ** **
C'est le but.
Enfin, j'expliquerai la régression du processus gaussien!
La régression de processus gaussien devient une régression de crête
** "Si l'entrée X est similaire, la sortie Y est également similaire." **
La fonction du processus gaussien est ajoutée en tant que condition de contrainte.
En d'autres termes, si la valeur prédite y de la régression du processus gaussien est également considérée comme une valeur obtenue par échantillonnage à partir d'une certaine distribution gaussienne, comme dans le cas de la régression linéaire et de la régression des crêtes évoquée précédemment,
La distribution gaussienne que suit la régression du processus gaussien est
** Ne suppose pas une "dispersion égale" comme la régression de crête, **
** La variance des valeurs prédites y, y 'change en fonction de la distance (c'est-à-dire si elles sont similaires) des entrées x, x'. ** **
On peut dire ça.
Dans cet esprit, vérifions la distribution gaussienne que suit la régression du processus gaussien.
N(k_*^TK^{-1}y, k_{**}-k_*^TK^{-1}k_*)
Ici, k et K inconnus sont sortis.
Ces k et K sont appelés noyaux et sont des "valeurs obtenues à partir de deux entrées x".
J'expliquerai en détail plus tard, mais ici
K: noyau obtenu à partir de l'entrée x entre les données d'entraînement k *: noyau obtenu à partir de l'entrée x des données d'apprentissage et de l'entrée x des données de test k **: noyau obtenu à partir de l'entrée x entre les données de test
Parce que la moyenne et la variance de la distribution gaussienne que suit la régression du processus gaussien incluent l'un des noyaux ci-dessus.
** Les relations de position entre diverses entrées x affectent à la fois la moyenne et la variance de la distribution gaussienne suivie par la régression gaussienne. ** **
Tu peux voir ça.
Cette fois, préparez les données suivantes.
Données originales: signal mixte créé artificiellement avec bruit Données d'entraînement: points d'échantillonnage aléatoires partiellement obtenus à partir des données d'origine Données prédictives: signal mixte bruyant d'origine
import numpy as np
#Création de données originales
n=100
data_x = np.linspace(0, 4*np.pi, n)
data_y = 2*np.sin(data_x) + 3*np.cos(2*data_x) + 5*np.sin(2/3*data_x) + np.random.randn(len(data_x))
#Manque le signal pour obtenir des points d'échantillonnage partiels
missing_value_rate = 0.2
sample_index = np.sort(np.random.choice(np.arange(n), int(n*missing_value_rate), replace=False))
Maintenant, vérifions avec pyplot de matplotlib.
from matplotlib import pyplot as plt
%matplotlib inline
plt.figure(figsize=(12, 5))
plt.title('signal data', fontsize=20)
#Signal d'origine
plt.plot(data_x, data_y, 'x', color='green', label='correct signal')
#Points d'échantillonnage partiels
plt.plot(data_x[sample_index], data_y[sample_index], 'o', color='red', label='sample dots')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12)
plt.show()
Les résultats sont les suivants.
Ce sont des données assez compliquées, mais comment prédire le processus gaussien ... (un peu inquiet.)
Le noyau est soudainement sorti ici, mais pour l'expliquer grossièrement,
** Trouver la matrice de covariance de la régression de processus gaussien sans calculer le vecteur de coefficient w **
C'est un outil.
Plus tôt, j'ai expliqué que le processus gaussien est une "régression de crête avec moyenne et variance de la valeur prévue y".
De plus, cette moyenne et cette variance sont calculées à partir de la relation selon laquelle «si l'entrée X est similaire, la sortie Y est également similaire» selon les caractéristiques du processus gaussien.
Par exemple, si l'entrée X est une donnée unidimensionnelle et que l'intervalle est de 1,0 de -10 à 10, la valeur prédite y (= xw) du processus gaussien est dérivée de la similitude ou de la relation de position de l'entrée X, donc 21 y peuvent être obtenus et le coefficient. Le vecteur w a 21 dimensions.
Si l'entrée X est bidimensionnelle, le vecteur de coefficient remplace la matrice et ses éléments passent à 441. Si vous l'augmentez encore en 3D, 4D, etc., les éléments de la matrice de coefficients augmenteront de façon exponentielle, ce qui entraînera une quantité énorme qui ne peut normalement pas être calculée.
De plus, non seulement la dimension mais également la plage de l'entrée X peuvent être encore élargies, ce qui n'est donc pas suffisant pour une quelconque quantité de puissance de calcul.
C'est là que le noyau entre en jeu.
En utilisant le noyau, la similitude entre les deux sorties y, y'correspondant directement entre les deux entrées x, x'est calculée directement sans calculer le vecteur de coefficient (ou matrice) w, qui est nécessaire pour la régression de processus gaussien. Vous pouvez trouver une matrice covariante!
Il existe plusieurs types de noyaux, mais cette fois nous utiliserons le noyau gaussien (noyau RBF) qui inclut les erreurs gaussiennes.
Pour le noyau gaussien, *** "Les valeurs décroissent de façon exponentielle comme une distribution gaussienne avec la distance des entrées x, x '." *** Il existe des fonctionnalités telles que.
La formule est exprimée comme suit. Ici, les valeurs des paramètres sont cette fois les trois suivantes. θ1, θ2: paramètres du noyau gaussiens θ3: dispersion d'erreur gaussienne
De plus, la fonction d'erreur gaussienne δ est Deux valeurs d'entrée x et x 'sont égales: δ (x, x') = 1 Autres: δ (x, x ') = 0 Branche conditionnelle comme suit.
Maintenant, implémentons l'expression en tant que fonction.
#Fonctionnaliser le noyau gaussien
def kernel(x, x_prime, p, q, r):
if x == x_prime:
delta = 1
else:
delta = 0
return p*np.exp(-1 * (x - x_prime)**2 / q) + ( r * delta)
θ1, θ2, θ3 sont p, q, r x, x est x, x_prime Il est devenu.
De là, nous allons procéder selon le chapitre 3, "Fig. 3.17 Algorithme de base pour le calcul de régression de processus gaussien".
Pour le moment, selon la notation du livre, divisez les données de signal créées précédemment en «données d'apprentissage» et «données de test» et redéfinissez-les d'une manière facile à comprendre.
#Définition des données
xtrain = np.copy(data_x[sample_index])
ytrain = np.copy(data_y[sample_index])
xtest = np.copy(data_x)
Passons maintenant à l'implémentation.
Ici, la distribution gaussienne suivie de la régression du processus gaussien précédemment présentée
N(k_*^TK^{-1}y, k_{**}-k_*^TK^{-1}k_*)
Nous calculerons à la fois la moyenne et la distribution en utilisant le noyau gaussien.
#moyenne
mu = []
#Distribué
var = []
#Chaque valeur de paramètre
Theta_1 = 1.0
Theta_2 = 0.4
Theta_3 = 0.1
#Moins que,Algorithme de base pour le calcul de régression de processus gaussien
train_length = len(xtrain)
#Préparer la fondation de la matrice du noyau entre les données d'entraînement
K = np.zeros((train_length, train_length))
for x in range(train_length):
for x_prime in range(train_length):
K[x, x_prime] = kernel(xtrain[x], xtrain[x_prime], Theta_1, Theta_2, Theta_3)
#Le produit intérieur est calculé par des points
yy = np.dot(np.linalg.inv(K), ytrain)
test_length = len(xtest)
for x_test in range(test_length):
#Préparer la base de la matrice du noyau entre les données de test et les données d'entraînement
k = np.zeros((train_length,))
for x in range(train_length):
k[x] = kernel(xtrain[x], xtest[x_test], Theta_1, Theta_2, Theta_3)
s = kernel(xtest[x_test], xtest[x_test], Theta_1, Theta_2, Theta_3)
#Calculez le produit intérieur avec des points,Ajouter au tableau de moyennes
mu.append(np.dot(k, yy))
#Premièrement, "k* K^-Pièce de 1 "(Puisqu'il s'agit d'un produit intérieur, c'est un point)Calcul
kK_ = np.dot(k, np.linalg.inv(K))
#Calculez le produit intérieur avec la seconde moitié avec des points,Ajouter à la baie distribuée
var.append(s - np.dot(kK_, k.T))
C'est un peu long, je vais donc l'expliquer dans l'ordre.
La première chose que nous voulons faire cette fois est la moyenne et la variance prévues du signal. (Étant donné que l'intervalle des valeurs prédites est le même que les données d'origine, 100 valeurs moyennes et variances sont stockées dans la liste.)
En outre, spécifiez d'abord la valeur du paramètre.
Le contenu de l'algorithme est le même que celui du livre, mais les modifications suivantes sont nécessaires lors de sa mise en œuvre en Python. -Avant de calculer K [x, x '], il est nécessaire de préparer le terrain pour la matrice du noyau K. (Cette fois, je l'ai créé avec une matrice zéro et réécrit les éléments.) -Comme le "*" dans le livre représente le produit interne des matrices, réécrivez-le comme np.dot (). ・ K [x] doit également être préparé avant le calcul. -Le produit interne des trois matrices dans le calcul de la variance est divisé en deux étapes et réécrit comme np.dot ().
Si vous gardez à l'esprit les points ci-dessus, la régression du processus gaussien est parfaite!
Enfin, vérifions avec pyplot de matplotlib.
plt.figure(figsize=(12, 5))
plt.title('signal prediction by Gaussian process', fontsize=20)
#Signal d'origine
plt.plot(data_x, data_y, 'x', color='green', label='correct signal')
#Points d'échantillonnage partiels
plt.plot(data_x[sample_index], data_y[sample_index], 'o', color='red', label='sample dots')
#Convertir la variance en écart type
std = np.sqrt(var)
#Signaler la valeur moyenne obtenue dans le processus gaussien
plt.plot(xtest, mu, color='blue', label='mean by Gaussian process')
#Range l'écart type obtenu dans le processus gaussien*Voir la fin du code pour la plage
plt.fill_between(xtest, mu + 2*std, mu - 2*std, alpha=.2, color='blue', label= 'standard deviation by Gaussian process')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12)
plt.show()
#Valeur moyenne ±(Écart type x 2) … 95.4%La valeur numérique spécifiée apparaît dans la plage avec la probabilité de
Les résultats sont les suivants.
Comme indiqué dans le code, cette fois, la variance prévue est convertie en écart type. En outre, deux fois l'écart type a été défini comme la plage attendue du processus gaussien.
intervalle | Probabilité que le nombre spécifié apparaisse dans la plage |
---|---|
Moyenne ± écart type | 68.3% |
Valeur moyenne ±(Écart type x 2) | 95.4% |
Valeur moyenne ±(Écart type x 3) | 99.7% |
La régression par processus gaussien présente deux avantages majeurs **.
Dans la régression linéaire et la régression de crête, lors de la création d'un modèle non linéaire, il était soutenu par la préparation et l'apprentissage de plusieurs fonctions d'ordre n. Par conséquent, ** «quel ordre de fonction doit être considéré» ** devient un goulot d'étranglement, et des efforts considérables doivent être consacrés à la construction du modèle.
Cependant, dans la régression de processus gaussien, ** "utiliser le noyau" vous permet d'obtenir un modèle non linéaire sans préparer de fonction d'ordre n. ** **
Par conséquent, le processus de calcul et l'algorithme d'apprentissage sont compliqués, mais il est possible de construire un modèle compliqué avec peu d'effort.
En observant le graphique de régression du processus gaussien obtenu en implémentant l'algorithme plus tôt, nous pouvons saisir les caractéristiques approximatives des données d'origine, mais en raison de la nature du processus gaussien, ** où les points d'échantillonnage sont largement espacés (axe horizontal: 8) (À proximité, etc.) ** est tout à fait faux.
Cependant, ces ** parties mal prédites ont une «dispersion» plus large que les autres parties **, et il semble que le processus gaussien lui-même avoue qu'il n'est pas sûr de la prédiction.
En d'autres termes, le processus gaussien est ** un modèle qui peut confirmer l'exactitude de la prédiction partielle **.
["Processus Gauss et apprentissage automatique"](https://www.amazon.co.jp/ Processus Gauss et apprentissage automatique - Série professionnelle d'apprentissage automatique - Mochihashi-Earth / dp / 4061529269) Supprimons le surapprentissage de la régression linéaire - régression Ridge et régression Lasso- to-kei.net -Statistiques pour toute l'humanité-