Thuật toán Monte Carlo lý tưởng sử dụng các giá trị ngẫu nhiên liên tiếp độc lập . Trong MCMC, các giá trị liên tiếp không độc lập, điều này làm cho phương thức hội tụ chậm hơn so với lý tưởng Monte Carlo; tuy nhiên, nó trộn càng nhanh, sự phụ thuộc càng phân rã nhanh hơn trong các lần lặp liên tiếp và nó hội tụ càng nhanh.
Ý tôi ở đây là các giá trị liên tiếp nhanh chóng "gần như độc lập" với trạng thái ban đầu, hay đúng hơn là với giá trị tại một thời điểm, các giá trị trở nên "gần như độc lập" với khi tăng lên; vì vậy, như qkhhly nói trong các bình luận, "chuỗi không bị kẹt trong một khu vực nhất định của không gian nhà nước".XnXń+kXnk
Chỉnh sửa: Tôi nghĩ ví dụ sau có thể giúp
Hãy tưởng tượng bạn muốn ước tính giá trị trung bình của phân phối đồng đều trên bởi MCMC. Bạn bắt đầu với chuỗi thứ tự ; ở mỗi bước, bạn chọn phần tử trong chuỗi và trộn ngẫu nhiên chúng. Ở mỗi bước, phần tử ở vị trí 1 được ghi lại; điều này hội tụ để phân phối thống nhất. Giá trị của kiểm soát độ nhanh trộn: khi thì chậm; khi{1,…,n}(1,…,n)k>2kk=2 , các phần tử liên tiếp là độc lập và trộn nhanh.k=n
Đây là hàm R cho thuật toán MCMC này:
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);
}
Hãy áp dụng nó cho và vẽ ước tính liên tiếp của giá trị trung bình μ = 50 dọc theo các lần lặp 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)
Bạn có thể thấy ở đây với (màu đen), sự hội tụ chậm; với k = 50 (màu xanh lam), nó nhanh hơn, nhưng vẫn chậm hơn so với k = 99 (màu đỏ).k=2k=50k=99
Bạn cũng có thể vẽ biểu đồ cho phân phối giá trị trung bình ước tính sau một số lần lặp cố định, ví dụ 100 lần lặp:
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