Path: blob/master/site/es-419/probability/examples/Bayesian_Gaussian_Mixture_Model.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Modelo de mezcla bayesiana gaussiana y MCMC hamiltoniano
En este Colab, exploraremos el muestreo de la posterior de un modelo de mezcla bayesiana gaussiana (BGMM) que usa solo primitivas de TensorFlow Probability.
Modelo
Para componentes de mezcla , cada uno de dimensión , nos gustaría modelar muestras iid con ayuda del siguiente modelo de mezcla bayesiana gaussiana:
Tenga en cuenta que todos los argumentos scale
tienen una semántica cholesky
. Usamos esta convención porque es la de TF Distributions (que a su vez usa esta convención en parte porque es computacionalmente ventajosa).
Nuestro objetivo es generar muestras de la posterior:
Observe que no está presente; solo nos interesan aquellas variables aleatorias que no escalan con . (Y, afortunadamente, hay una distribución de TF que se encarga de marginar a ).
No es posible tomar muestras directamente de esta distribución debido a un término de normalización intratable desde el punto de vista computacional.
Los algoritmos de Metropolis-Hastings son técnicas que nos permiten muestrear distribuciones difíciles de normalizar.
TensorFlow Probability ofrece varias opciones de MCMC, incluidas varias basadas en Metropolis-Hastings. En este bloc de notas, usaremos el Hamiltoniano de Monte Carlo (tfp.mcmc.HamiltonianMonteCarlo
). El algoritmo HMC suele ser una buena opción porque puede converger rápidamente, muestrear el espacio de estados de forma conjunta (en lugar de coordinadamente) y aprovechar una de las virtudes de TF: la diferenciación automática. Dicho esto, el muestreo de una posterior de BGMM en realidad podría aplicarse mejor a partir de otros enfoques, por ejemplo, el muestreo de Gibb.
Antes de compilar el modelo, debemos definir un nuevo tipo de distribución. A partir de la especificación del modelo anterior, está claro que estamos parametrizando la MVN con una matriz de covarianza inversa, es decir, [matriz de precisión](https://en.wikipedia.org/wiki/Precision_(statistics)). Para lograr esto en TF, debemos implementar nuestro Bijector
. Este Bijector
utilizará la transformación directa:
Y = tf.linalg.triangular_solve((tf.linalg.matrix_transpose(chol_precision_tril), X, adjoint=True) + loc
.
Y el cálculo log_prob
es exactamente lo inverso, es decir:
X = tf.linalg.matmul(chol_precision_tril, X - loc, adjoint_a=True)
.
Dado que todo lo que necesitamos para el HMC es log_prob
, esto significa que evitamos llamar tf.linalg.triangular_solve
(como sería el caso de tfd.MultivariateNormalTriL
). Esto es conveniente ya que tf.linalg.matmul
suele ser más rápido debido a una mejor ubicación en caché.
La distribución tfd.Independent
convierte las extracciones independientes de una distribución en una distribución multivariada con coordenadas estadísticamente independientes. En términos de cálculo log_prob
, esta "metadistribución" se manifiesta como una simple suma de las dimensiones del evento.
Observe también que tomamos la ("transposición") adjoint
de la matriz de escala. Esto se debe a que, si la precisión es covarianza inversa, es decir, y si , entonces donde .
Dado que esta distribución es un poco complicada, verifiquemos rápidamente que nuestro MVNCholPrecisionTriL
funcione como creemos que debería hacerlo.
Dado que la media y la covarianza de la muestra se acercan a la media y la covarianza verdaderas, pareciera que la distribución se implementa correctamente. Ahora, usaremos MVNCholPrecisionTriL
tfp.distributions.JointDistributionNamed
para especificar el modelo BGMM. Para el modelo observacional, usaremos tfd.MixtureSameFamily
para integrar automáticamente las extracciones .
Genere datos de "entrenamiento"
Para esta demostración, tomaremos muestras de algunos datos aleatorios.
Inferencia bayesiana con el HMC
Ahora que ya usamos TFD para especificar nuestro modelo y obtuvimos algunos datos observados, tenemos todas las piezas necesarias para ejecutar el HMC.
Para esto, usaremos una aplicación parcial para "precisar" lo que no queremos probar. En este caso, eso significa que solo tenemos que precisar observations
. (Los hiperparámetros ya están integrados en las distribuciones previas y no forman parte de la firma de la función joint_log_prob
).
Representación sin restricciones
El algoritmo hamiltoniano de Monte Carlo (HMC) requiere que la función de probabilidad logarítmica objetivo se pueda diferenciar de sus argumentos. Además, el HMC puede exhibir una eficiencia estadística drásticamente mayor si el espacio de estados no tiene restricciones.
Esto significa que tendremos que resolver dos problemas principales al tomar muestras de la posterior de BGMM:
representa un vector de probabilidad discreto, es decir, debe ser tal que y .
representa una matriz de covarianza inversa, es decir, debe ser tal que , es decir, sea definida positiva.
Para abordar este requisito, tendremos que hacer lo siguiente:
transformar las variables restringidas en un espacio no restringido
ejecutar el MCMC en un espacio sin restricciones
transformar las variables no restringidas nuevamente en el espacio restringido.
Al igual que sucede con MVNCholPrecisionTriL
, usaremos Bijector
para transformar variables aleatorias en espacio sin restricciones.
El
Dirichlet
se transforma en espacio sin restricciones mediante la función softmax.Nuestra variable aleatoria de precisión es una distribución sobre matrices semidefinidas positivas. Para liberarlas, usaremos los biyectores
FillTriangular
yTransformDiagonal
. Estos se encargan de convertir vectores en matrices triangulares inferiores y garantizan que la diagonal sea positiva. El primero es útil porque permite muestrear solo flotantes en lugar de .
Ahora ejecutaremos la cadena e imprimiremos las medias posteriores.
Conclusión
En esta sencilla colaboración se demostró cómo se pueden usar las primitivas de TensorFlow Probability para crear modelos de mezcla bayesiana jerárquica.