14 votos

Confundido con MCMC de Metropolis-Hastings variaciones: Paseo Aleatorio, No Aleatorias, Independientes, Metropolis

En las últimas semanas he estado tratando de entender MCMC y el de Metropolis-Hastings algoritmo(s). Cada vez me creo entender que me doy cuenta de que estoy equivocado. La mayoría de los ejemplos de código que me encuentro en la línea de implementar algo que no es consistente con la descripción. es decir: Ellos dicen que implementar Metropolis-Hastings pero, en realidad, implementar paseo aleatorio metrópoli. Otros (casi siempre) de forma automática omitir la aplicación de las Hastings corrección de la relación porque están usando un simétrica propuesta de distribución. En realidad, no he encontrado un solo ejemplo sencillo en el que se calcula la relación. Que me hace aún más confundido. Alguien puede darme ejemplos de código (en cualquier idioma) de los siguientes:

  • La vainilla No Aleatoria a Pie de Metropolis-Hastings Algoritmo con Hastings la corrección del cálculo de la proporción (incluso si esto va a terminar siendo 1 cuando se utiliza un simétrica propuesta de distribución).
  • Vainilla Paseo Aleatorio de Metropolis-Hastings algoritmo.
  • Vainilla Independiente de Metropolis-Hastings algoritmo.

No es necesario proporcionar la Metrópoli algoritmos porque si no me equivoco la única diferencia entre la Metrópoli y de Metropolis-Hastings es que el primero siempre se muestra de una distribución simétrica y por lo tanto no tienen el Hastings corrección de la relación. No hay necesidad de darle explicación detallada de los algoritmos. Yo no entiendo lo básico, pero estoy un poco confundido con todos los diferentes nombres de las diferentes variaciones de la Metropolis-Hastings algoritmo, pero también con la forma de aplicar en la práctica el Hastings corrección de la relación de la Vainilla no-random-walk MH. Por favor, no copiar y pegar los enlaces que parcialmente responder a mis preguntas, porque lo más probable es que ya han visto. Los enlaces que me llevó a esta confusión. Gracias.

8voto

bheklilr Puntos 113

Aquí tienes tres ejemplos. He hecho el código mucho menos eficiente de lo que sería en una aplicación real con el fin de hacer la lógica más clara (espero.)

# We'll assume estimation of a Poisson mean as a function of x
x <- runif(100)
y <- rpois(100,5*x)  # beta = 5 where mean(y[i]) = beta*x[i]

# Prior distribution on log(beta): t(5) with mean 2 
# (Very spread out on original scale; median = 7.4, roughly)
log_prior <- function(log_beta) dt(log_beta-2, 5, log=TRUE)

# Log likelihood
log_lik <- function(log_beta, y, x) sum(dpois(y, exp(log_beta)*x, log=TRUE))

# Random Walk Metropolis-Hastings 
# Proposal is centered at the current value of the parameter

rw_proposal <- function(current) rnorm(1, current, 0.25)
rw_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.25, log=TRUE)
rw_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.25, log=TRUE)

rw_alpha <- function(proposal, current) {
   # Due to the structure of the rw proposal distribution, the rw_p_proposal_given_current and
   # rw_p_current_given_proposal terms cancel out, so we don't need to include them - although
   # logically they are still there:  p(prop|curr) = p(curr|prop) for all curr, prop
   exp(log_lik(proposal, y, x) + log_prior(proposal) - log_lik(current, y, x) - log_prior(current))
}

# Independent Metropolis-Hastings
# Note: the proposal is independent of the current value (hence the name), but I maintain the
# parameterization of the functions anyway.  The proposal is not ignorable any more
# when calculation the acceptance probability, as p(curr|prop) != p(prop|curr) in general.

ind_proposal <- function(current) rnorm(1, 2, 1) 
ind_p_proposal_given_current <- function(proposal, current) dnorm(proposal, 2, 1, log=TRUE)
ind_p_current_given_proposal <- function(current, proposal) dnorm(current, 2, 1, log=TRUE)

ind_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}

# Vanilla Metropolis-Hastings - the independence sampler would do here, but I'll add something
# else for the proposal distribution; a Normal(current, 0.1+abs(current)/5) - symmetric but with a different
# scale depending upon location, so can't ignore the proposal distribution when calculating alpha as
# p(prop|curr) != p(curr|prop) in general

van_proposal <- function(current) rnorm(1, current, 0.1+abs(current)/5)
van_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.1+abs(current)/5, log=TRUE)
van_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.1+abs(proposal)/5, log=TRUE)

van_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}


# Generate the chain
values <- rep(0, 10000) 
u <- runif(length(values))
naccept <- 0
current <- 1  # Initial value
propfunc <- van_proposal  # Substitute ind_proposal or rw_proposal here
alphafunc <- van_alpha    # Substitute ind_alpha or rw_alpha here
for (i in 1:length(values)) {
   proposal <- propfunc(current)
   alpha <- alphafunc(proposal, current)
   if (u[i] < alpha) {
      values[i] <- exp(proposal)
      current <- proposal
      naccept <- naccept + 1
   } else {
      values[i] <- exp(current)
   }
}
naccept / length(values)
summary(values)

Para la vainilla sampler, obtenemos:

> naccept / length(values)
[1] 0.1737
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.843   5.153   5.388   5.378   5.594   6.628 

que es una baja probabilidad de aceptación, pero aún así... la afinación de la propuesta de ayuda aquí, o la adopción de una diferente. Aquí está el paseo aleatorio de la propuesta resultados:

> naccept / length(values)
[1] 0.2902
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.718   5.147   5.369   5.370   5.584   6.781 

Resultados similares, como sería de esperar, y una mejor probabilidad de aceptación (el objetivo para el ~50%, con un parámetro.)

Y, la integridad, la independencia sampler:

> naccept / length(values)
[1] 0.0684
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.990   5.162   5.391   5.380   5.577   8.802 

Porque no se "adaptan" a la forma de la parte posterior, que tiende a tener los más pobres probabilidad de aceptación y es el más difícil de sintonizar bien para este problema.

Nota que, en general, preferimos las propuestas con más gordo colas, pero eso es otro tema.

0voto

Fritz Lang Puntos 1

Ver:

Por construcción, el algoritmo no depende de la constante de normalización, ya que lo que importa es la relación de los archivos pdf. La variación del algoritmo en el que la propuesta pdf $q()$ no es simétrica, es debido a Hasting (1970) y por esta razón, el algoritmo es a menudo también se llama Metropolis-Hasting. Por otra parte, lo que se ha descrito aquí es el algoritmo de Metropolis, en contraste con la local, en el que un ciclo que afecta sólo a uno de los componentes de ${\bf x}$.

El artículo de la Wikipedia es un buen complementarios de lectura. Como se puede ver, la ciudad también tiene una corrección de "relación", pero, como se mencionó anteriormente, Hastings introdujo una modificación que permite la no-simétrica propuesta de distribución de resultados.

El algoritmo de Metropolis está implementado en el paquete de R mcmc bajo el comando metrop().

Otros ejemplos de código:

http://www.mas.ncl.ac.uk/~ndjw1/docencia/sim/metrop/

http://pcl.missouri.edu/jeff/node/322

http://darrenjw.wordpress.com/2010/08/15/metropolis-hastings-mcmc-algorithms/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X