L'algorithme de Monte Carlo idéal utilise des valeurs aléatoires successives indépendantes . Dans MCMC, les valeurs successives ne sont pas indépendantes, ce qui rend la méthode convergente plus lente que le Monte Carlo idéal; cependant, plus elle se mélange rapidement, plus la dépendance diminue rapidement au cours des itérations successives¹ et plus elle converge rapidement.
¹ Je veux dire ici que les valeurs successives sont rapidement "presque indépendantes" de l'état initial, ou plutôt que compte tenu de la valeur à un moment donné, les valeurs deviennent rapidement "presque indépendantes" de mesure que croît; ainsi, comme le dit qkhhly dans les commentaires, "la chaîne ne reste pas coincée dans une certaine région de l'espace étatique".X ń + k X n kXnXń+kXnk
Edit: Je pense que l'exemple suivant peut aider
Imaginez que vous vouliez estimer la moyenne de la distribution uniforme sur par MCMC. Vous commencez avec la séquence ordonnée ; à chaque étape, vous avez choisi éléments dans la séquence et les mélangez au hasard. À chaque étape, l'élément en position 1 est enregistré; cela converge vers la distribution uniforme. La valeur de contrôle la rapidité de mélange: lorsque , elle est lente; lorsque , les éléments successifs sont indépendants et le mélange est rapide.( 1 , … , n ) k > 2 k k = 2 k = n{1,…,n}( 1 , … , n )k > 2kk = 2k = n
Voici une fonction R pour cet algorithme 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);
}
Appliquons-le pour et traçons l'estimation successive de la moyenne long des itérations MCMC:μ = 50n = 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)
Vous pouvez voir ici que pour (en noir), la convergence est lente; pour (en bleu), c'est plus rapide, mais toujours plus lent qu'avec (en rouge).k = 50 k = 99k = 2k = 50k = 99
Vous pouvez également tracer un histogramme pour la distribution de la moyenne estimée après un nombre fixe d'itérations, par exemple 100 itérations:
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)
Vous pouvez voir qu'avec (M1), l'influence de la valeur initiale après 100 itérations ne vous donne qu'un résultat terrible. Avec cela semble correct, avec un écart-type encore plus grand qu'avec . Voici les moyens et sd:k = 50 k = 99k = 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