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
fuente
Respuestas:
Cuando se le da un conjunto de prueba, , los valores esperados se calcularán considerando una distribución condicional del valor de la función para estos nuevos puntos de datos, dados los puntos de datos en el conjunto de entrenamiento, . La idea expuesta en el video es que tendríamos una distribución conjunta de y (en la conferencia denotado por un asterisco, ) de la forma:mi una una mi ∗
El condicional de una distribución gaussiana multivariada tiene una media . Ahora, teniendo en cuenta que la primera fila de la matriz de bloques de covarianzas anterior es para , pero solo para , se ser necesario para hacer las matrices congruentes en:mi(X1El |X2) =μ1+Σ12Σ- 122(X2-μ2) [ 50 × 50 ] Σa a [ 50 × 5 ] Σa e
Ingrese la descomposición de Cholesky (que nuevamente codificaré en naranja como en OP):
Si , entonces , y terminamos con un sistema lineal que podemos resolver, obteniendo . Aquí está la diapositiva clave en la presentación original:m =La a- 1yt r La am =yt r metro
Como , Eq. (*) es equivalente a la ecuación (1) de la ecuación en el OP:siTUNAT= ( Asi)T
Dado que
Se aplicaría un razonamiento similar a la varianza, comenzando con la fórmula para la varianza condicional en un gaussiano multivariado:
que en nuestro caso sería:
y llegando a la ecuación (2):
Podemos ver que la ecuación (3) en el OP es una forma de generar curvas aleatorias posteriores condicionadas a los datos (conjunto de entrenamiento), y utilizando una forma de Cholesky para generar tres sorteos aleatorios normales multivariados :
fuente