"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy

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. MLP_GaussianProcess.jpg Le cerf est un repère. Il est facile à comprendre et fortement recommandé.

Quel est le processus gaussien?

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!

4 étapes pour le retour du 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). ..

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

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.

2. Retour de crête

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.

  1. Stabilisation du calcul

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.

  1. Le surapprentissage peut être évité. rl_title2-1024x641.png La figure de gauche est le résultat d'une régression linéaire surentraînée, et la figure de droite est le résultat d'une régression de crête. (Citation de graphique de Supprimons le surapprentissage de la régression linéaire-Régression de crête et régression de Lasso-)

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.

3. Distribution gaussienne et régression linéaire, régression des crêtes

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.

4. Régression du processus gaussien

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.

Implémentation de la régression de processus gaussien

Créer des données

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

Définition du noyau

1. À propos du noyau

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!

2. Implémentation du noyau

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. Gaussian kernel with noize.png 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.

Implémentation d'algorithme

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%

Avantages du processus gaussien

La régression par processus gaussien présente deux avantages majeurs **.

1. Un modèle non linéaire est facilement obtenu

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.

2. La précision partielle des prévisions peut être confirmée

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 **.

Références / Liens de référence

["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é-

Recommended Posts

"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy
Apprentissage automatique avec python (2) Analyse de régression simple
Régression de processus gaussien Implémentation Numpy et GPy
Régression du noyau avec Numpy uniquement
Implémentation de SMO avec Python + NumPy
Apprentissage automatique avec Python! Préparation
"Introduction à l'apprentissage automatique par inférence bayésienne" Inférence approximative du modèle mixte de Poisson implémenté uniquement avec Python numpy
Apprentissage automatique par python (1) Classification générale
Classification et régression dans l'apprentissage automatique
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
[Apprentissage automatique] Essayez d'exécuter Spark MLlib avec Python et faites des recommandations
Amplifiez les images pour l'apprentissage automatique avec Python
[Shakyo] Rencontre avec Python pour l'apprentissage automatique
Construction d'environnement AI / Machine Learning avec Python
Vulkan compute avec Python avec VkInline et pense à l'apprentissage automatique GPU et plus
Apprentissage automatique à partir de Python Personal Memorandum Part2
Apprentissage automatique à partir de Python Personal Memorandum Part1
[Python] Collectez des images avec Icrawler pour l'apprentissage automatique [1000 feuilles]
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python
Créer un environnement d'apprentissage automatique Python avec des conteneurs
Défis d'apprentissage automatique de Coursera en Python: ex3 (reconnaissance de nombres manuscrits avec récursivité logistique)
Machine Learning avec docker (40) avec anaconda (40) "Hands-On Data Science and Python Machine Learning" Par Frank Kane
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitres 11 et 12 Introduction à Pandas Matplotlib
Processus gaussien avec pymc3
Régression de processus gaussien utilisant GPy
Cartes propres laplaciennes avec Scikit-learn (notes personnelles)
Processus gaussien
"Processus Gauss et apprentissage automatique" Régression de processus Gauss implémentée uniquement avec Python numpy
Régression de processus gaussien Implémentation Numpy et GPy
Remarques sur avec
notes personnelles python
Manipuler des fichiers Excel à partir de python avec xlrd (mémo personnel)
Résumé des notes personnelles des pandas
notes personnelles en python manquantes
Régression linéaire avec statsmodels
Régression avec un modèle linéaire
Effectuer une analyse de régression avec NumPy
Essayez la régression avec TensorFlow
Extraire "date actuelle uniquement" et "date et heure actuelles" avec python datetime.
Astuces Python et Numpy
Apprentissage automatique avec Raspberry Pi 4 et Coral USB Accelerator
Apprendre Python avec ChemTHEATER 03
"Orienté objet" appris avec python
Apprendre Python avec ChemTHEATER 05-1
Exécutez un pipeline de machine learning avec Cloud Dataflow (Python)
Régression logistique d'apprentissage automatique
Apprentissage des données relationnelles avec numpy et NetworkX (clustering spectral)
Défis d'apprentissage automatique de Coursera en Python: ex2 (retour logistique)
Apprenez en exécutant avec le nouveau Python! Manuel d'apprentissage automatique par Makoto Ito numpy / keras Attention!
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
Régression linéaire d'apprentissage automatique
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
Apprendre Python avec ChemTHEATER 01
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)
Résumé du flux de base de l'apprentissage automatique avec Python
Python: apprentissage supervisé (retour)
J'ai essayé de mettre en œuvre le co-filtrage (recommandation) avec redis et python
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
Effectuer une analyse de régression avec NumPy
Processus gaussien avec pymc3
Configurer des bibliothèques Python et d'apprentissage automatique sur Ubuntu
[Apprentissage automatique] Démarrez Spark avec iPython Notebook et essayez MLlib
Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
J'ai commencé l'apprentissage automatique avec le clustering Python, la compression et la visualisation de dimensions
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (4)
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 7 Analyse de régression
Apprentissage automatique pour apprendre avec Nogisaka 46 et Keyakizaka 46 Partie 1 Introduction
Paramètres d'environnement d'apprentissage automatique basés sur Python3 sur Mac (coexistence avec Python2)
[Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques
Régression de processus gaussien utilisant GPy
Programmation avec Python et Tkinter