Переплутаний з варіантами Метрополіса-Гастінгса MCMC: Random-Walk, Non-Random-Walk, Independent, Metropolis


15

За останні кілька тижнів я намагався зрозуміти MCMC та алгоритм (и) Metropolis-Hastings. Кожен раз, коли я думаю, що це розумію, я усвідомлюю, що я помиляюся. Більшість прикладів коду, які я вважаю, реалізують он-лайн щось, що не відповідає опису. тобто: Вони кажуть, що вони реалізують Метрополіс-Гастінгс, але насправді реалізують метрополію з випадковими прогулянками. Інші (майже завжди) мовчки пропускають реалізацію коефіцієнта корекції Гастінгса, оскільки вони використовують симетричний розподіл пропозицій. Насправді я не знайшов жодного простого прикладу, який би нарахував коефіцієнт. Це мене ще більше плутає. Чи може хтось надати мені приклади коду (будь-якою мовою) з наступного:

  • Невипадковий алгоритм Метрополіс-Гастінгса з ваніллю з розрахунком коефіцієнта корекції Гастінгса (навіть якщо це в кінцевому рахунку буде 1 при використанні симетричного розподілу пропозицій).
  • Алгоритм ванільної випадкової прогулянки Метрополіс-Гастінгс.
  • Алгоритм незалежної мегаполісу-Гастінгса від ванілі.

Не потрібно надавати алгоритми Metropolis, тому що, якщо я не помиляюся, єдина відмінність між Metropolis і Metropolis-Hastings полягає в тому, що перші завжди вибирають із симетричного розподілу і, отже, вони не мають коефіцієнта корекції Гастінгса. Не потрібно давати детальне пояснення алгоритмів. Я розумію основи, але мене ніби не плутають усі різні назви для різних варіантів алгоритму «Метрополіс-Гастінгс», а також з тим, як ви практично реалізуєте коефіцієнт корекції Гастінгса на ванільному не випадковому ході MH. Будь ласка, не копіюйте посилання, які частково відповідають на мої запитання, тому що, швидше за все, я їх уже бачив. Ці зв’язки привели мене до цієї плутанини. Дякую.

Відповіді:


10

Ось вам три приклади. Я зробив код набагато менш ефективним, ніж це було б у реальній програмі, щоб зробити логіку чіткішою (сподіваюся.)

# 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)

Для пробовідбору ванілі ми отримуємо:

> 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 

що є низькою ймовірністю прийняття, але все ж ... налаштування пропозиції допоможе тут, або прийняття іншої. Ось випадкові результати прогулянкової пропозиції:

> 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 

Подібні результати, як можна було б сподіватися, і краща ймовірність прийняття (націлення на ~ 50% за допомогою одного параметра.)

І для повноти вибірник незалежності:

> 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 

Оскільки він не "адаптується" до форми задньої частини, він, як правило, має найменшу ймовірність прийняття і найважче налаштувати цю проблему.

Зауважте, що загалом ми б віддавали перевагу пропозиціям з жирними хвостами, але це зовсім інша тема.


Q

1
@floyd - це корисно в ряді ситуацій, наприклад, якщо ви маєте гідне уявлення про місце розташування центру розподілу (наприклад, тому, що ви обчислили оцінки MLE або MOM) і можете вибрати пропозицію з нежирним хвостом. розподілу, або якщо час обчислення за ітерацію дуже низький, тоді ви можете запустити дуже довгий ланцюг (що компенсує низькі показники прийняття) - таким чином заощадите час на аналіз та програмування, що може бути набагато більшим, ніж навіть неефективний час виконання. Це не буде типовою першою пропозицією спробувати, хоча це, ймовірно, буде випадковою прогулянкою.
jbowman

Qp(хт+1|хт)

1
p(хт+1|хт)=p(хт+1)

1

Побачити:

q()х

Стаття у Вікіпедії - це гарне доповнення. Як бачимо, Метрополіс також має "коефіцієнт корекції", але, як було сказано вище, Гастінгс ввів модифікацію, яка дозволяє несиметричний розподіл пропозицій.

Алгоритм Metropolis реалізований в пакеті R mcmcпід командою metrop().

Інші приклади коду:

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

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

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


Дякую за вашу відповідь На жаль, це не відповідає на жодне моє запитання. Я бачу лише мегаполіси з випадковими прогулянками, мегаполіси без випадкових прогулянок та незалежні МЗ. Коефіцієнт корекції Гастінгса dnorm(can,mu,sig)/dnorm(x,mu,sig)у вибірці незалежності першого посилання не дорівнює 1. Я вважав, що він повинен бути рівним 1 при використанні симетричного розподілу пропозицій. Це тому, що це незалежний пробовідбірник, а не звичайний НД-випадковий прогулянка? Якщо так, то яке співвідношення Гастінгса для рівнини MH?
AstrOne

p(струм|пропозиція)=p(пропозиція|струм)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.