Розуміння Метрополіс-Гастінгса з асиметричним розподілом пропозицій


14

Я намагаюся зрозуміти алгоритм Metropolis-Hastings, щоб написати код для оцінки параметрів моделі (тобто ). Відповідно до бібліографії алгоритм Метрополіс-Гастінгса має такі кроки:f(x)=ax

  • СтворитиYtq(y|xt)
  • Xt+1={Yt,with probabilityρ(xt,Yt),xt,with probability1ρ(xt,Yt),

деρ(x,y)=min(f(y)f(x)q(x|y)q(y|x),1)

Як я хотів би задати кілька питань:

  • У бібліографії зазначено, що якщо q є симетричним розподілом, відношення q(x|y)/q(y|x) стає 1, а алгоритм називається Metropolis. Це правильно? Єдина відмінність між Метрополісом та Метрополісом-Гастінгсом полягає в тому, що перший використовує симетричний розподіл? А як щодо метрополії "Випадкова прогулянка" (-Хастінгс)? Чим він відрізняється від двох інших?
  • Більшість прикладів коду, який я вважаю, використовує он-лайн розподіл пропозицій Гаусса q і таким чином ρ(x,y)=min(f(y)/f(x),1) де f(y)/f(x) - коефіцієнт ймовірності. Що робити, якщо пропозиція розповсюдження є пуассонським розподілом? Я думаю, що я раціонально розумію, чому це співвідношення не стає 1 при використанні асиметричного розподілу, але я не зовсім впевнений, чи розумію це математично чи як реалізувати його з кодом. Чи може хтось надати мені простий код (C, python, R, псевдо-код або що завгодно більше) приклад алгоритму Metropolis-Hastings, використовуючи несиметричний розподіл пропозицій?

1
Я щойно згадував чудову публікацію в блозі щодо пов’язаного питання, можливо, це допомагає: darrenjw.wordpress.com/2012/06/04/…
Joint_p

Відповіді:


20

У бібліографії зазначено, що якщо q є симетричним розподілом, відношення q (x | y) / q (y | x) стає 1, а алгоритм називається Metropolis. Це правильно?

Так, це правильно. Алгоритм Metropolis - це особливий випадок алгоритму MH.

А як щодо метрополії "Випадкова прогулянка" (-Хастінгс)? Чим він відрізняється від двох інших?

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

Чим він відрізняється від двох інших?

У алгоритмі невипадкової ходьби фіксовано розподіл пропозицій. У варіанті випадкової прогулянки центр розподілу пропозицій змінюється на кожній ітерації.

Що робити, якщо пропозиція розповсюдження є пуассонським розподілом?

Тоді вам потрібно використовувати МЗ замість просто мегаполісу. Імовірно, це буде вибіркою дискретного розподілу, інакше ви не хочете використовувати дискретну функцію для створення ваших пропозицій.

У будь-якому випадку, якщо розподіл вибірки обрізаний або ви попередньо знаєте про його перекос, ви, ймовірно, хочете використовувати асиметричний розподіл вибірки, і тому вам потрібно використовувати мегаполіси.

Чи може хтось надати мені простий код (C, python, R, псевдо-код або що завгодно більше) приклад?

Ось мегаполіс:

Metropolis <- function(F_sample # distribution we want to sample
                      , F_prop  # proposal distribution 
                      , I=1e5   # iterations
               ){
  y = rep(NA,T)
  y[1] = 0    # starting location for random walk
  accepted = c(1)

  for(t in 2:I)    {
    #y.prop <- rnorm(1, y[t-1], sqrt(sigma2) ) # random walk proposal
    y.prop <- F_prop(y[t-1]) # implementation assumes a random walk. 
                             # discard this input for a fixed proposal distribution

    # We work with the log-likelihoods for numeric stability.
    logR = sum(log(F_sample(y.prop))) -
           sum(log(F_sample(y[t-1])))    

    R = exp(logR)

    u <- runif(1)        ## uniform variable to determine acceptance
    if(u < R){           ## accept the new value
      y[t] = y.prop
      accepted = c(accepted,1)
    }    
    else{
      y[t] = y[t-1]      ## reject the new value
      accepted = c(accepted,0)
    }    
  }
  return(list(y, accepted))
}

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

set.seed(100)

test = function(x){dnorm(x,-5,1)+dnorm(x,7,3)}

# random walk
response1 <- Metropolis(F_sample = test
                       ,F_prop = function(x){rnorm(1, x, sqrt(0.5) )}
                      ,I=1e5
                       )
y_trace1 = response1[[1]]; accpt_1 = response1[[2]]
mean(accpt_1) # acceptance rate without considering burn-in
# 0.85585   not bad

# looks about how we'd expect
plot(density(y_trace1))
abline(v=-5);abline(v=7) # Highlight the approximate modes of the true distribution

введіть тут опис зображення

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

response2 <- Metropolis(F_sample = test
                            ,F_prop = function(x){rnorm(1, -5, sqrt(0.5) )}
                            ,I=1e5
                       )

y_trace2 = response2[[1]]; accpt_2 = response2[[2]]
mean(accpt_2) # .871, not bad

Спочатку це виглядає нормально, але якщо ми подивимось на задню щільність ...

plot(density(y_trace2))

введіть тут опис зображення

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

response2b <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 7, sqrt(10) )}
                        ,I=1e5
)

plot(density(response2b[[1]]))

Ми можемо спробувати перекинути нашу пропозицію між двома режимами, але нам потрібно встановити дисперсію справді високою, щоб мати можливість вивчити будь-який з них

response3 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, -2, sqrt(10) )}
                        ,I=1e5
)
y_trace3 = response3[[1]]; accpt_3 = response3[[2]]
mean(accpt_3) # .3958! 

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

plot(density(y_trace3))

введіть тут опис зображення

plot(y_trace3) # we really need to set the variance pretty high to catch 
               # the mode at +7. We're still just barely exploring it

Ми все ще застрягаємо в тіснішому з двох режимів. Спробуємо перекинути це безпосередньо між двома режимами.

response4 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 1, sqrt(10) )}
                        ,I=1e5
)
y_trace4 = response4[[1]]; accpt_4 = response4[[2]]

plot(density(y_trace1))
lines(density(y_trace4), col='red')

введіть тут опис зображення

Нарешті ми наближаємось до того, що шукали. Теоретично, якщо ми дозволимо пробігу пробігати досить довго, ми можемо отримати репрезентативний зразок з будь-якого з цих розподілів пропозицій, але випадковий пробіг дуже швидко дав корисний зразок, і нам довелося скористатися нашими знаннями про те, як передбачалося заднє шукати налаштування фіксованих розподілів вибірки для отримання корисного результату (що, правда кажучи, у нас ще зовсім не існує y_trace4).

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


Дивовижна відповідь! Дуже дякую! У моєму випадку у мене є параметрична модель 6-7, і я поняття не маю, як може виглядати задній розподіл (але це може бути бімодальним), оскільки мої набори даних іноді зовсім інші. Виходячи з того, що ви сказали, я можу або використовувати Metropolis (-Hastings), використовуючи величезну дисперсію в розповсюдженні пропозицій, або використовувати Random Walk Metropolis (-Hastings) з меншою дисперсією в розповсюдженні пропозицій. Ні за яких особливих обставин друге рішення не повинно швидше переходити до цільового розподілу. Правильно?
AstrOne

Тепер, пов'язаний з кодом Метрополіса-Гастінгса, я думав замінити R=exp(logR)цим: R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))як для випадкової, так і для невипадкової прогулянки MH. Це правильно?
AstrOne

1
В основному, але, як я згадую в котрі мегаполісу: ви хочете виконувати свої обчислення в просторі журналу. Розрахунки ймовірності, як правило, працюють на дуже малих значеннях, тому ви, як правило, отримуєте набагато кращі результати, додаючи логарифми та експонуючи свої результати, ніж множувати неодноразові значення разом.
Девід Маркс

1
Вам не потрібно турбуватися про поточний стан ланцюга (тобто ), коли ви використовуєте фіксований розподіл пропозицій, оскільки: . Фіксований розподіл пропозицій породжує незалежні пропозиції. Ми враховуємо у співвідношенні мегаполісів. q ( y t | y t - 1 ) = q ( y t ) y t - 1yt1q(yt|yt1)=q(yt)yt1
Девід Маркс

1
Ви заявляєте "В алгоритмі невипадкової ходьби розподіли пропозицій виправлені. У варіанті випадкової прогулянки центр розподілу пропозицій змінюється на кожній ітерації", що є невірним. У версіях МЗ, які не є випадковими прогулянками, здебільшого є пропозиції, які залежать від поточного стану ланцюга Маркова, іноді навіть зосередженого на цьому стані. Основним прикладом є алгоритм Langevin MCMC. Коли пропозиція виправлена, це незалежний алгоритм МЗ .
Сіань
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.