๊น์ค ์ํ๋ง(Gibbs sampling)
๊น์ค ์ํ๋ง(Gibbs sampling)์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค. ๋ค๋ฃฐ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊น์ค ์ํ๋ง
2. ๊น์ค ์ํ๋ง์ ์์
1. ๊น์ค ์ํ๋ง
๊น์ค ์ํ๋ง์ Metropolis Hastings(์ดํ MH) ์๊ณ ๋ฆฌ์ฆ์ ํน๋ณํ ํํ๋ก, ์ ์ ๋ถํฌ(Proposal distribution)๋ฅผ ์์ ์ Full conditional distribution๋ก ๋์ด ์ํ๋งํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ, ๊ฐ ์ํ์์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ์ ๋ํด Acceptance probability๋ 1์ด ๋๋ ์ฑ์ง์ ๊ฐ์ง๊ฒ ๋๋ค. ๋ค์์ ์ฆ๋ช ์ ํตํ์ฌ ์ด๋ฅผ ํ์ธํด๋ณด์.
โท ์ ์ ๋ถํฌ๋ฅผ Full conditional posterior๋ก ๋ ์ผ๋ก์จ ๋ฏธ์ธ ๊ท ํ ์กฐ๊ฑด(Detailed balance condition)์ด ์ฑ๋ฆฝํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ alpha๋ฅผ ํตํด ์ ์ดํ๋ฅ (Transition probability)์ ๋ณด์ ํ ํ์ ์์ด, ๋งค ์ํ์์ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์ด๋ฉด(Accept) ๋๋ค.
๊น์ค ์ํ๋ง์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
โท ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ์ ๋ํ ๊ฒ์ด๊ณ , ์ด๋ฅผ ์ผ๋ฐํํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ชจ์์ ์ฌํ๋ถํฌ๋ก๋ถํฐ ๋ฐ์ดํฐ ์์ฑ์ ํ ์ ์๋ค.
2. ๊น์ค ์ํ๋ง์ ์์
๋ฌธ์ )
์๋ ๋ชจ๋ธ์ ๋ชจ์์ธ mu์ sigma^2๋ฅผ ์ฌํ๋ถํฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์์ค.
ํ์ด)
โท Full joint posterior์ ์ ๋ฆฌํ๋ฉด ์์ ์์ ๊ตฌํ ์ ์๋ค. ์ด๋, ๊ฐ ๋ชจ์์ ๋ํ์ฌ full conditional posterior์ ๊ตฌํ๋ ค๋ฉด Full joint posterior์์ ๊ด์ฌ ๋ชจ์๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๋ชจ์๋ ์์๋ก ์ทจํ๊ณ , ์ด๋ฅผ ํตํด ๋ถํฌ๋ฅผ ์ถ๋ก ํ๋ค. mu์ sigma^2๋ ๋ชจ๋ ์ผค๋ ์ฌ์ ๋ถํฌ๋ก์จ ์ฌ์ ๋ถํฌ์ ์ฌํ๋ถํฌ๊ฐ ๊ฐ์ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฐ ๋ชจ์์ ์ฌํ๋ถํฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๊น์ค ์ํ๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ๋ณด์.
In:
update_mu = function(n, ybar, sig2, mu_0, sig2_0) {
sig2_1 = 1.0 / (n / sig2 + 1.0 / sig2_0)
mu_1 = sig2_1 * (n * ybar / sig2 + mu_0 / sig2_0)
return(rnorm(n = 1, mean = mu_1, sd = sqrt(sig2_1)))
}
update_sig2 = function(n, y, mu, nu_0, beta_0) {
nu_1 = nu_0 + n / 2.0
sumsq = sum( (y - mu)^2 )
beta_1 = beta_0 + sumsq / 2.0
out_gamma = rgamma(n = 1, shape = nu_1, rate = beta_1)
return(1.0 / out_gamma)
}
gibbs_sampl = function(y, n_iter, init, prior) {
ybar = mean(y)
n = length(y)
mu_out = numeric(n_iter)
sig2_out = numeric(n_iter)
mu_now = init$mu
for (i in 1:n_iter) {
sig2_now = update_sig2(n = n,
y = y,
mu = mu_now,
nu_0 = prior$nu_0,
beta_0 = prior$beta_0)
mu_now = update_mu(n = n,
ybar = ybar,
sig2 = sig2_now,
mu_0 = prior$mu_0,
sig2_0 = prior$sig2_0)
sig2_out[i] = sig2_now
mu_out[i] = mu_now
}
return(cbind(mu = mu_out, sig2 = sig2_out))
}
โท update_mu()์ update_sigma()๋ฅผ ๋ง๋ค์ด ๋ชจ์๋ณ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ ์๋๋ก ํ๋ค.
โท gibs_sampl()์ ๊น์ค ์ํ๋ง ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ํ ํ์๋งํผ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
In:
y = c(1.2, 1.4, -0.5, 0.3, 0.9, 2.3, 1.0, 0.1, 1.3, 1.9)
ybar = mean(y)
n = length(y)
prior = list()
prior$mu_0 = 0.0
prior$sig2_0 = 1.0
prior$n_0 = 2.0
prior$s2_0 = 1.0
prior$nu_0 = prior$n_0 / 2.0
prior$beta_0 = prior$n_0 * prior$s2_0 / 2.0
init = list()
init$mu = 0.0
library('coda')
post_sampl = gibbs_sampl(y = y, n_iter = 1e3, init = init, prior = prior)
plot(as.mcmc(post_sampl))
summary(as.mcmc(post_sampl))
โท y๋ ์ฌํ๋ถํฌ๋ฅผ ๊ตฌํ๊ธฐ ์ํ ๋ฐ์ดํฐ์ด๋ค. prior์ ์ฌ์ ๋ถํฌ์ ๋ชจ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ค.
โท init์ ๊น์ค ์ํ๋ง์ ํ๊ธฐ ์ํ ์ด๊ธฐ๊ฐ์ ์ฃผ๊ณ , gibbs_sampl()์ ํตํด ์ฌํ๋ถํฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
โท coda ํจํค์ง๋ฅผ ์ด์ฉํ์ฌ plot()๊ณผ summary()๋ฅผ ํตํด ๊น์ค ์ํ๋ง ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ์ ๋ํด ํ์ธํ ์ ์๋ค.
Out:
Iterations = 1:1000
Thinning interval = 1
Number of chains = 1
Sample size per chain = 1000
1. Empirical mean and standard deviation for each variable,
plus standard error of the mean:
Mean SD Naive SE Time-series SE
mu 0.9188 0.2758 0.008723 0.008723
sig2 0.9065 0.4727 0.014949 0.015826
2. Quantiles for each variable:
2.5% 25% 50% 75% 97.5%
mu 0.3451 0.7533 0.9268 1.093 1.454
sig2 0.3796 0.5968 0.7957 1.085 2.179
Reference:
"Bayesian Statistics: From Concept to Data AnalysisTechniques and Models," Coursera, www.coursera.org/learn/bayesian-statistics/.
"(๊ธฐ๊ณ ํ์ต, Machine Learning) Week 10 Sampling Based Inference | Lecture 7 Gibbs Sampling," AAILab Kaist, www.youtube.com/watch?v=Q9EYGw5QbHc&t=633s.