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.
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".
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:
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":
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:
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:K_train
Ch_train
K_trte
# 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
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