Markov-Chain-Montecarlo
我們為什麼要關心 MCMC 鏈中的快速混合?
當使用馬爾可夫鏈蒙特卡羅進行推理時,我們需要一個快速混合的鏈,即快速移動通過後驗分佈的支持。但我不明白為什麼我們需要這個屬性,因為據我了解,接受的候選抽籤應該並且將集中在後驗分佈的高密度部分。如果我的理解是真的,那麼我們是否仍然希望鏈條穿過支撐(包括低密度部分)?
另外,如果我使用MCMC做優化,是否還需要關心快速混合,為什麼?
感謝您分享您的想法!
理想的蒙特卡洛算法使用獨立的連續隨機值。在 MCMC 中,連續值不是獨立的,這使得該方法的收斂速度比理想的 Monte Carlo 慢;但是,它混合得越快,在連續迭代中依賴性衰減得越快¹,並且收斂得越快。
¹我的意思是連續值很快“幾乎獨立於”初始狀態,或者更確切地說,給定值在某一時刻,價值觀迅速變得“幾乎獨立”作為成長;因此,正如 qkhhly 在評論中所說,“鏈不會一直停留在狀態空間的某個區域”。
編輯:我認為以下示例可以提供幫助
想像一下,你想估計均勻分佈的平均值由 MCMC 提供。您從有序序列開始; 在每一步,你選擇序列中的元素並隨機打亂它們。在每一步,記錄位置 1 的元素;這收斂到均勻分佈。的價值控制混合速度:當,很慢;什麼時候,連續的元素是獨立的,混合速度很快。
這是此 MCMC 算法的 R 函數:
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); }
讓我們申請,並繪製均值的連續估計沿著 MCMC 迭代:
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)
你可以在這裡看到(黑色),收斂慢;為了(藍色),它更快,但仍然比(紅色的)。
您還可以繪製固定迭代次數(例如 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)
你可以看到(M1),100次迭代後初始值的影響只會給你一個可怕的結果。和看起來沒問題,標準偏差比. 這是手段和sd:
> 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