Por primera vez (excusa imprecisión / errores) eché un vistazo a los procesos gaussianos y, más específicamente, vi este video de Nando de Freitas . Las notas están disponibles en línea aquí .
En algún momento, extrae muestras aleatorias de una normal multivariada generada mediante la construcción de una matriz de covarianza basada en un núcleo gaussiano (exponencial de distancias cuadradas en el eje ). Estas muestras aleatorias forman los gráficos suaves anteriores que se vuelven menos dispersos a medida que los datos están disponibles. En última instancia, el objetivo es predecir modificando la matriz de covarianza y obteniendo la distribución gaussiana condicional en los puntos de interés.
El código completo está disponible en un excelente resumen de Katherine Bailey aquí , que a su vez acredita un repositorio de códigos de Nando de Freitas aquí . He publicado el código de Python aquí por conveniencia.
Comienza con (en lugar de las anteriores) funciones anteriores e introduce un "parámetro de ajuste".
He traducido el código a Python y [R] , incluidas las parcelas:
Aquí está el primer fragmento de código en [R] y la gráfica resultante de tres curvas aleatorias generadas a través de un núcleo gaussiano basado en la proximidad en los valores de en el conjunto de prueba:
La segunda parte del código R es más complicada y comienza simulando cuatro puntos de datos de entrenamiento, lo que eventualmente ayudará a reducir la propagación entre las posibles (anteriores) curvas alrededor de las áreas donde se encuentran estos puntos de datos de entrenamiento. La simulación del valor para estos puntos de datos es como una función . Podemos ver el "ajuste de las curvas alrededor de los puntos":
La tercera parte del código R trata de trazar la curva de los valores medios estimados (el equivalente de la curva de regresión), correspondiente a valores (ver el cálculo a continuación), y sus intervalos de confianza:
PREGUNTA: Quiero pedir una explicación de las operaciones que tienen lugar cuando se pasa del GP anterior al posterior.
Específicamente, me gustaría entender esta parte del código R (en el segundo fragmento) para obtener los medios y 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
Hay dos núcleos (uno de train ( ) v. Train ( ), llamémoslo , con su Cholesky ( ), , coloreando naranja todos los Cholesky de aquí en adelante, y el segundo del tren ( ) v test ( ) , llamémoslo ), y para generar las medias estimadas para los puntos en el conjunto de prueba, la operación es: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
¿Como funciona esto?
Tampoco está claro el cálculo de las líneas de color (GP posterior) en el gráfico anterior " Tres muestras del GP posterior ", donde el Cholesky de los conjuntos de prueba y entrenamiento parece unirse para generar valores normales multivariados, eventualmente agregados a :
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