Path: blob/master/site/pt-br/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 mistura gaussiana bayesiana e MCMC Hamiltoniano
Neste Colab, veremos a amostragem da distribuição posterior de um modelo de mistura gaussiana bayesiana (BGMM, na sigla em inglês) usando somente os primitivos do TensorFlow Probability.
Modelo
Para componentes de mistura, cada um com dimensão , gostaríamos de modelar iid amostras usando o seguinte modelo de mistura gaussiana bayesiana:
Observação: todos os argumentos scale
têm semântica cholesky
. Usamos essa convenção porque é a mesma do TF Distributions (que usa essa convenção em parte porque tem vantagens computacionais).
Nosso objetivo é gerar amostras da distribuição posterior:
Observe que não está presente, pois temos interesse somente nas variáveis aleatórias que não têm a escala ajustada com (e felizmente existe uma distribuição do TF que trata a marginalização de .)
Não é possível fazer a amostragem diretamente dessa distribuição devido a um termo de normalização intratável computacionalmente.
Os algoritmos de Metropolis-Hastings são técnicas para amostrar distribuições com normalização intratável.
O TensorFlow Probability oferece diversas opções de MCMC, incluindo várias baseadas nos algoritmos de Metropolis-Hastings. Neste notebook, usaremos o Monte Carlo Hamiltoniano (tfp.mcmc.HamiltonianMonteCarlo
). O HMC costuma ser uma boa escolha porque pode convergir rapidamente, faz a amostragem do espaço de estados conjuntamente (ao contrário de por coordenadas) e aproveita uma das virtudes do TF: a diferenciação automática. Dito isso, a amostragem de uma distribuição posterior BGMM pode ser feita de uma forma melhor por outras técnicas, como, por exemplo, a amostragem de Gibbs.
Antes de criar o modelo, precisamos definir um novo tipo de distribuição. Pela especificação do modelo acima, está claro que estamos parametrizando a MVN com uma matriz de covariância inversa, isto é, [matriz de precisão](https://en.wikipedia.org/wiki/Precision_(statistics)). Para fazer isso no TF, precisamos utilizar o Bijector
. Esse Bijector
usará a transformação forward:
Y = tf.linalg.triangular_solve((tf.linalg.matrix_transpose(chol_precision_tril), X, adjoint=True) + loc
.
E o cálculo de log_prob
é simplesmente o inverso:
X = tf.linalg.matmul(chol_precision_tril, X - loc, adjoint_a=True)
.
Como só o que precisamos para o HMC é log_prob
, podemos evitar chamar tf.linalg.triangular_solve
(que seria o caso para tfd.MultivariateNormalTriL
). Isso traz vantagens, pois tf.linalg.matmul
costuma ser mais rápido devido a uma melhor localidade do cache.
A distribuição tfd.Independent
transforma obtenções independentes de uma distribuição em uma distribuição multivariada com coordenadas estatisticamente independentes. Quanto à computação de log_prob
, essa "metadistribuição" se manifesta como uma simples soma das dimensões do evento.
Observe também que pegamos o adjoint
("transposição") da matriz de escala, pois, se a precisão tiver covariância inversa, ou seja, e se , então , em que .
Como essa distribuição é complicada, vamos verificar rapidamente se o MVNCholPrecisionTriL
funciona como achamos que deveria funcionar.
Como a média e a covariância da amostra estão próximas da média e covariância reais, parece que a distribuição foi implementada corretamente. Agora, usaremos MVNCholPrecisionTriL
tfp.distributions.JointDistributionNamed
para especificar o modelo de BGMM. Para o modelo observacional, usaremos tfd.MixtureSameFamily
para fazer a integral das obtenções automaticamente.
Gere dados de "treinamento"
Para esta demonstração, faremos a amostragem de dados aleatórios.
Inerência bayesiana usando HMC
Agora que usamos o TFD para especificar nosso modelo e obtivemos alguns dados observados, temos todos os componentes necessários para executar o HMC.
Usaremos uma aplicação parcial para "imobilizar" o que não queremos amostrar. Neste caso, precisamos imobilizar somente observations
(os hiperparâmetros já estão incorporados às distribuições a priori e não fazem parte da assinatura da função joint_log_prob
).
Representação não restrita
O Monte Carlo Hamiltoniano (HMC, na sigla em inglês) requer que a função de probabilidade logarítmica alvo seja diferenciável quanto aos seus argumentos. Além disso, o HMC pode ter uma eficiência estatística drasticamente superior se o espaço de estados for não restrito.
Portamos, teremos que tratar dois problemas principais ao fazer a amostragem da distribuição BGMM posterior:
representa um vetor de probabilidades discretas, isto é, precisa ser de tal forma que e .
representa uma matriz de covariância inversa, isto é, precisa ser de tal forma que , ou seja, é definida positiva.
Para tratar esse requisito, precisaremos:
transformar as variáveis restritas em um espaço não restrito
executar o MCMC no espaço não restrito
transformar as variáveis não restritas de volta no espaço restrito
Da mesma forma que em MVNCholPrecisionTriL
, usaremos Bijector
s para transformar variáveis aleatórias no espaço não restrito.
Dirichlet
é transformado no espaço não restrito por meio da função softmax.Nossa variável aleatória de precisão é uma distribuição de matrizes semidefinidas positivas. Para remover a restrição delas, usaremos os bijetores
FillTriangular
eTransformDiagonal
, que convertem os vetores em matrizes triangulares inferiores e garantem que a diagonal seja positiva. O primeiro é útil porque permite a amostragem somente de pontos flutuantes, em vez de .
Agora vamos executar a cadeia e exibir as médias posteriores via print.
Conclusão
Este Colab simples demonstrou como os primitivos do TensorFlow Probability podem ser usados para criar modelos de mistura bayesiana hierárquicos.