Simuler le postérieur d'un processus gaussien

8

Pour la première fois (excuse imprécision / erreurs) j'ai regardé les processus gaussiens , et plus précisément, j'ai regardé cette vidéo de Nando de Freitas . Les notes sont disponibles en ligne ici .

À un moment donné, il tire échantillons aléatoires d'une normale multivariée générée en construisant une matrice de covariance basée sur un noyau gaussien (exponentielle des distances au carré sur l' axe des ). Ces échantillons aléatoires forment les tracés lisses antérieurs qui deviennent moins étalés à mesure que les données deviennent disponibles. Finalement, l'objectif est de prédire en modifiant la matrice de covariance et en obtenant la distribution gaussienne conditionnelle aux points d'intérêt.10x

entrez la description de l'image ici

Le code entier est disponible à un excellent résumé par Katherine Bailey ici , qui à son tour crédite un référentiel de code par Nando de Freitas ici . Je l'ai posté le code Python ici pour plus de commodité.

Il commence par (au lieu de ci-dessus) fonctions antérieures, et introduit un "paramètre de réglage".310

J'ai traduit le code en Python et [R] , y compris les tracés:

Voici le premier morceau de code dans [R] et le tracé résultant de trois courbes aléatoires générées via un noyau gaussien basé sur la proximité des valeurs dans l'ensemble de test:x

! [entrez la description de l'image ici

Le deuxième morceau de code R est plus velu et commence par simuler quatre points de données d'entraînement, ce qui finira par aider à réduire l'écart entre les courbes possibles (antérieures) autour des zones où se trouvent ces points de données d'entraînement. La simulation de la valeur pour ces points de données est une fonction . On voit le "resserrement des courbes autour des points":ysin()

entrez la description de l'image ici

Le troisième morceau de code R concerne le tracé de la courbe des valeurs moyennes estimées (l'équivalent de la courbe de régression), correspondant à valeurs (voir calcul ci-dessous), et leurs intervalles de confiance:50 μ

entrez la description de l'image ici

QUESTION: Je veux demander une explication des opérations qui ont lieu lors du passage du GP précédent au postérieur.

Plus précisément, j'aimerais comprendre cette partie du code R (dans le deuxième morceau) pour obtenir les moyens et sd:

# Apply the kernel function to our training points (5 points):

K_train = kernel(Xtrain, Xtrain, param)                          #[5 x 5] matrix

Ch_train = chol(K_train + 0.00005 * diag(length(Xtrain)))        #[5 x 5] matrix

# Compute the mean at our test points:

K_trte = kernel(Xtrain, Xtest, param)                            #[5 x 50] matrix
core = solve(Ch_train) %*% K_trte                                #[5 x 50] matrix
temp = solve(Ch_train) %*% ytrain                                #[5 x 1] matrix
mu = t(core) %*% temp                                            #[50 x 1] matrix

Il y a deux noyaux (l'un de train ( ) contre train ( ), appelons-le , avec son Cholesky ( ), , colorant en orange tous les Cholesky à partir d'ici, et le second du train ( ) v test ( ), appelons-le ), et pour générer les moyennes estimées pour les points de l'ensemble de test, l'opération est:aaK_trainΣaaCh_trainLaaaeK_trteΣaeμ^50

(Eq.1)μ^=[Laa1[5×5]Σae[5×50]]TLaa1[5×5]ytr[5×1]dimensions=[50×1]
# Compute the standard deviation:

tempor = colSums(core^2)                                          #[50 x 1] matrix

# Notice that all.equal(diag(t(core) %*% core), colSums(core^2)) TRUE

s2 = diag(K_test) - tempor                                        #[50 x 1] matrix
stdv = sqrt(s2)                                                   #[50 x 1] matrix

(Eq.2)var^=diag(Σee)diag[[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]=d[1111]d[[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]dimensions=[50×1]

Comment cela marche-t-il?

Le calcul des lignes de couleur (GP postérieur) dans le graphique " Trois échantillons du GP postérieur " ci-dessus est également peu clair, où le Cholesky des ensembles de test et de formation semble se réunir pour générer des valeurs normales multivariées, éventuellement ajoutées à :μ^

Ch_post_gener = chol(K_test + 1e-6 * diag(n) - (t(core) %*% core))
m_prime = matrix(rnorm(n * 3), ncol = 3)
sam = Ch_post_gener %*% m_prime
f_post = as.vector(mu) + sam 

(Eq.3)fpost=μ^+[Lee[50×50][[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]][N(0,1)[50×3]]dimensions=[50×3]
Antoni Parellada
la source
Dans le dernier graphique, les intervalles de confiance ne devraient-ils pas "pincer" aux points connus?
GeoMatt22
@ GeoMatt22 Ils font en quelque sorte, ne pensez-vous pas?
Antoni Parellada du

Réponses:

2

Lorsqu'on leur donne un ensemble de test, , les valeurs attendues seront calculées en considérant une distribution conditionnelle de la valeur de la fonction pour ces nouveaux points de données, étant donné les points de données dans l'ensemble d'apprentissage, . L'idée exposée dans la vidéo est que nous aurions une distribution conjointe de et (dans la conférence indiquée par un astérisque, ) de la forme:eaae

[ae]N([μaμe],[ΣaaΣaeΣaeTΣee])
.

Le conditionnel d'une distribution gaussienne multivariée a une moyenne . Maintenant, considérant que la première ligne de la matrice de blocs de covariances ci-dessus est pour , mais seulement pour , une volonté transposée être nécessaire pour rendre les matrices congruentes en:E(x1|x2)=μ1+Σ12Σ221(x2μ2)[50×50]Σaa[50×5]Σae

E(e|a)=μe+ΣaeTΣaa1(yμa)
Comme le modèle est planifié avec , la formule se simplifie bien en :μa=μe=0

E(e|a)=ΣaeTΣaa1ytr

Entrez la décomposition de Cholesky (que je coderai encore en orange comme dans OP):

E(e|a)=ΣaeTΣaa1ytr<α>=ΣaeT(LaaLaaT)1ytr=ΣaeTLaaTLaa1ytr(*)=ΣaeTLaaTLaa1ytr<m>

Si , alors , et nous nous retrouvons avec un système linéaire que nous pouvons résoudre, obtenant . Voici la diapositive clé de la présentation originale:m=Laa1ytrLaam=ytrm


entrez la description de l'image ici


Puisque , Eq. (*) équivaut à l'équation de l'équation (1) dans l'OP:BTAT=(AB)T

μ^=[Laa1[5×5]Σae[5×50]]TLaa1[5×5]ytr[5×1]=(ΣaeTLaaT)(Laa1ytr)dimensions=[50×1]

étant donné que

[Laa1[5×5]Σae[5×50]]T=Σae[50×5]TLaa1T[5×5]

Un raisonnement similaire serait appliqué à la variance, en commençant par la formule de la variance conditionnelle dans une gaussienne multivariée:

var(x1|x2)=Σ11Σ12Σ221Σ21

qui dans notre cas serait:

varμ^e=ΣeeΣaeTΣaa1Σae=ΣeeΣaeT[LaaLaaT]1Σae=ΣeeΣaeT[Laa1]TLaa1Σae=Σee[Laa1Σae]TLaa1Σae

et en arrivant à l'équation (2):

varμ^e=d[Kee[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]dimensions=[50×1]

Nous pouvons voir que l'équation (3) dans l'OP est un moyen de générer des courbes aléatoires postérieures conditionnelles aux données (ensemble d'apprentissage) et d'utiliser une forme de Cholesky pour générer trois tirages aléatoires normaux multivariés :

fpost=μ^+[varμ^e][rnorm(0,1)]=μ^+[Lee[50×50][[Laa1[5×5]Σae[5×50]]T[Laa1[5×5]Σae[5×50]]]][rand.norm's[50×3]]dimensions=[50×3]
Antoni Parellada
la source
1
Est-ce un livre ou un papier? Avez-vous un moyen robuste de calculer la moyenne et la variance conditionnelles lorsque la matrice de covariance est EXTRÊMEMENT mal conditionnée (mais sans supprimer ou fusionner des points de données presque dépendants (à proximité)) en double précision? La multi-précision dans les logiciels fonctionne, mais a un ralentissement de 2,5 à 3 ordres de grandeur par rapport à la double précision matérielle, donc même un algorithme de double précision "lent" sera bon. Je ne pense pas que Cholesky le coupe. Je ne pense pas que même QR le fasse non plus lorsque la matrice de covariance est très mal conditionnée. À l'aide de backsolves standard, semblent avoir besoin d'une précision ocutuple.
Mark L. Stone