Simulando el posterior de un proceso gaussiano

8

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.10x

ingrese la descripción de la imagen aquí

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".310

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:x

! [ingrese la descripción de la imagen aquí

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":ysin()

ingrese la descripción de la imagen aquí

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:50 μ

ingrese la descripción de la imagen aquí

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:aaK_trainΣunaunaCh_trainLunaunaunamiK_trteΣunamiμ^50

(Ecuación 1)μ^=[Lunauna-1[5 5×5 5]Σunami[5 5×50]]TLunauna-1[5 5×5 5]ytr[5 5×1]dimensiones=[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

(Ecuación 2)var^=diag(Σmimi)-diag[[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T[Lunauna-1[5 5×5 5]Σunami[5 5×50]]]=re[1...1...1...1]-re[[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T[Lunauna-1[5 5×5 5]Σunami[5 5×50]]]dimensiones=[50×1]

¿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 

(Ecuación 3)Fenviar=μ^+[Lmimi[50×50]-[[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T[Lunauna-1[5 5×5 5]Σunami[5 5×50]]]][norte(0 0,1)[50×3]]dimensiones=[50×3]
Antoni Parellada
fuente
En el último gráfico, ¿no deberían los intervalos de confianza "pellizcar" en los puntos conocidos?
GeoMatt22
@ GeoMatt22 Lo hacen, ¿no te parece?
Antoni Parellada

Respuestas:

2

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:miunaunami

[unami]norte([μunaμmi],[ΣunaunaΣunamiΣunamiTΣmimi])
.

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Σ22-1(X2-μ2)[50×50]Σunauna[50×5 5]Σunami

mi(miEl |una)=μmi+ΣunamiTΣunauna-1(y-μuna)
Debido a que el modelo está planeado con , la fórmula se simplifica muy bien en :μuna=μmi=0 0

mi(miEl |una)=ΣunamiTΣunauna-1ytr

Ingrese la descomposición de Cholesky (que nuevamente codificaré en naranja como en OP):

mi(miEl |una)=ΣunamiTΣunauna-1ytr<--α-->=ΣunamiT(LunaunaLunaunaT)-1ytr=ΣunamiTLunauna-TLunauna-1ytr(*)=ΣunamiTLunauna-TLunauna-1ytr<-metro->

Si , entonces , y terminamos con un sistema lineal que podemos resolver, obteniendo . Aquí está la diapositiva clave en la presentación original:metro=Lunauna-1ytrLunaunametro=ytrmetro


ingrese la descripción de la imagen aquí


Como , Eq. (*) es equivalente a la ecuación (1) de la ecuación en el OP:siTUNAT=(UNAsi)T

μ^=[Lunauna-1[5 5×5 5]Σunami[5 5×50]]TLunauna-1[5 5×5 5]ytr[5 5×1]=(ΣunamiTLunauna-T)(Lunauna-1ytr)dimensiones=[50×1]

Dado que

[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T=Σunami[50×5 5]TLunauna-1T[5 5×5 5]

Se aplicaría un razonamiento similar a la varianza, comenzando con la fórmula para la varianza condicional en un gaussiano multivariado:

vunar(X1El |X2)=Σ11-Σ12Σ22-1Σ21

que en nuestro caso sería:

varμ^mi=Σmimi-ΣunamiTΣunauna-1Σunami=Σmimi-ΣunamiT[LunaunaLunaunaT]-1Σunami=Σmimi-ΣunamiT[Lunauna-1]TLunauna-1Σunami=Σmimi-[Lunauna-1Σunami]TLunauna-1Σunami

y llegando a la ecuación (2):

varμ^mi=re[Kmimi-[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T[Lunauna-1[5 5×5 5]Σunami[5 5×50]]]dimensiones=[50×1]

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 :

Fenviar=μ^+[varμ^mi][rnorm(0 0,1)]=μ^+[Lmimi[50×50]-[[Lunauna-1[5 5×5 5]Σunami[5 5×50]]T[Lunauna-1[5 5×5 5]Σunami[5 5×50]]]][rand.norm's[50×3]]dimensiones=[50×3]
Antoni Parellada
fuente
1
¿Es esto de un libro o papel? ¿Tiene una manera sólida de calcular la media y la varianza condicionales cuando la matriz de covarianza está EXTREMADAMENTE mal acondicionada (pero sin eliminar o fusionar ningún punto de datos casi dependiente (cercano)) con doble precisión? La precisión múltiple en el software funciona, pero tiene una desaceleración de 2.5 a 3 órdenes de magnitud frente a la doble precisión de hardware, por lo que incluso un algoritmo de precisión doble "lento" será bueno. No creo que Cholesky lo corte. No creo que incluso QR lo haga tampoco cuando la matriz de covarianza está muy mal condicionada. El uso de soluciones de fondo estándar parece necesitar una precisión ocupuple.
Mark L. Stone