『ゼロからできるMCMC』 Chapter6 Gibbs SamplingをJuliaで
最終更新:2020/11/24
『ゼロからできるMCMC』 Chapter6 Gibbs Samplingのコードを, 練習を兼ねてJuliaで書いてみました. 詳細なことを書くと著作権的にだめな気もするので, 解説などはありません.
Julia Version 1.5.0
GSを用いた3次元正規分布からのサンプリング
Gibbs Sampling ( GS ) を用いて, 3次元正規分布からサンプルをとります.
Julia
using Plots
using Random:seed!
using Distributions
function gs3dgaussian(;niter=10^3)
# ================= 準備 =================
seed!(12345)
x, y, z = 0.0, 0.0, 0.0 # 初期配位
res = zeros(niter+1, 3) # サンプルを格納する
res[1, :] .= x, y, z
# ========================================
# ================= 更新 =================
σx = 1/sqrt(A[1, 1])
σy = 1/sqrt(A[2, 2])
σz = 1/sqrt(A[3, 3])
μx(y, z) = -y*A[1, 2]/A[1, 1] - z*A[1, 3]/A[1, 1]
μy(x, z) = -x*A[2, 1]/A[2, 2] - z*A[2, 3]/A[2, 2]
μz(x, y) = -x*A[3, 1]/A[3, 3] - y*A[3, 2]/A[3, 3]
for iSample in 1:niter
x = σx*randn() + μx(y, z)
y = σy*randn() + μy(x, z)
z = σz*randn() + μz(x, y)
res[iSample+1, :] .= x, y, z
end
# ========================================
return res
end
# 結果
# 作用にでててくるAᵢⱼを定義
A = [1.0 1.0 1.0;
1.0 2.0 1.0;
1.0 1.0 2.0];
res = gs3dgaussian();
pyplot(fmt=:svg, size=(400, 400))
scatter3d(res[:, 1], res[:, 2], res[:, 3])
PyPlot.savefig("GS_q.png", dpi=300)
多分大丈夫でしょう.
