У бібліографії зазначено, що якщо 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
розрахунку).