Ідеальний алгоритм Монте-Карло використовує незалежні послідовні випадкові значення. У MCMC послідовні значення не є незалежними, що змушує метод сходитися повільніше, ніж ідеальний Монте-Карло; однак, чим швидше вона змішується, тим швидше залежність зменшується в послідовних ітераціях¹, і тим швидше вона конвергується.
¹ Я маю в виду тут , що послідовні значення швидко «практично НЕ залежить» від початкового стану, або , вірніше , що з урахуванням значення в одній точці, значення Х ń + K стали швидко «майже НЕ залежить» від X п , як до зростає; так, як говорить qkhhly у коментарях, "ланцюг не затримується в певному регіоні простору держави".XnXń+kXnk
Редагувати: Я думаю, що наступний приклад може допомогти
Уявіть, що ви хочете оцінити середнє значення рівномірного розподілу по за MCMC. Ви починаєте з упорядкованої послідовності ( 1 , … , n ) ; на кожному кроці ви вибирали k > 2 елементи в послідовності і випадковим чином переміщуєте їх. На кожному кроці записується елемент у положенні 1; це сходить до рівномірного розподілу. Значення k керує швидкістю перемішування: коли k = 2 , вона повільна; коли k = n , послідовні елементи незалежні і перемішування відбувається швидко.{1,…,n}(1,…,n)k>2kk=2k=n
Ось функція R для цього алгоритму MCMC:
mcmc <- function(n, k = 2, N = 5000)
{
x <- 1:n;
res <- numeric(N)
for(i in 1:N)
{
swap <- sample(1:n, k)
x[swap] <- sample(x[swap],k);
res[i] <- x[1];
}
return(res);
}
Застосуємо його для та побудуємо послідовну оцінку середнього μ = 50 вздовж ітерацій MCMC:n=99μ=50
n <- 99; mu <- sum(1:n)/n;
mcmc(n) -> r1
plot(cumsum(r1)/1:length(r1), type="l", ylim=c(0,n), ylab="mean")
abline(mu,0,lty=2)
mcmc(n,round(n/2)) -> r2
lines(1:length(r2), cumsum(r2)/1:length(r2), col="blue")
mcmc(n,n) -> r3
lines(1:length(r3), cumsum(r3)/1:length(r3), col="red")
legend("topleft", c("k = 2", paste("k =",round(n/2)), paste("k =",n)), col=c("black","blue","red"), lwd=1)
Тут ви бачите, що для (чорним кольором) конвергенція повільна; для k = 50 (синього кольору) він швидше, але все ж повільніше, ніж при k = 99 (червоним кольором).k=2k=50k=99
Ви також можете побудувати графік для розподілу передбачуваного середнього значення після фіксованого числа ітерацій, наприклад 100 ітерацій:
K <- 5000;
M1 <- numeric(K)
M2 <- numeric(K)
M3 <- numeric(K)
for(i in 1:K)
{
M1[i] <- mean(mcmc(n,2,100));
M2[i] <- mean(mcmc(n,round(n/2),100));
M3[i] <- mean(mcmc(n,n,100));
}
dev.new()
par(mfrow=c(3,1))
hist(M1, xlim=c(0,n), freq=FALSE)
hist(M2, xlim=c(0,n), freq=FALSE)
hist(M3, xlim=c(0,n), freq=FALSE)
k=2k=50k=99
> mean(M1)
[1] 19.046
> mean(M2)
[1] 49.51611
> mean(M3)
[1] 50.09301
> sd(M2)
[1] 5.013053
> sd(M3)
[1] 2.829185