<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Metropolis-Hastings |</title><link>https://chaeniverse.github.io/tags/metropolis-hastings/</link><atom:link href="https://chaeniverse.github.io/tags/metropolis-hastings/index.xml" rel="self" type="application/rss+xml"/><description>Metropolis-Hastings</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sat, 07 Sep 2024 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Metropolis-Hastings</title><link>https://chaeniverse.github.io/tags/metropolis-hastings/</link></image><item><title>MCMC (Metropolis-Hastings)</title><link>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</guid><description>&lt;h2 id="markov-chain-monte-carlo"&gt;Markov Chain Monte Carlo&lt;/h2&gt;
&lt;p&gt;간단히 말하면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Markov chain&lt;/strong&gt; 은 그 전에 몇 번 시행했든 간에 &lt;strong&gt;바로 이전 시행에 대해서만&lt;/strong&gt; 영향을 받는다는 거고,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monte Carlo&lt;/strong&gt; 는 이상한 pdf의 분포를 구하기 어려울 때, 해당하는 pdf의 $x$ 를 많이 sampling해서 근사화시켜 표본 평균과 표본 분산을 구하는 과정을 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="동기"&gt;동기&lt;/h2&gt;
&lt;p&gt;가령, $f(x)$ 라는 분포의 기댓값, 분산을 알고 싶다고 하자.&lt;/p&gt;
&lt;p&gt;이때 이 분포의 모양이 특이하면 (봉우리가 여러 개 있는 등), 적분하기 상당히 까다로울 것이다. 이럴 때 정규분포를 따르는 $h(x)$ 를 하나 씌워서 여기서 data point를 무작위로 뽑아 근사시켜 표본 평균·표본 분산을 구하는 식으로 기댓값과 분산을 유추할 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Target distribution f(x) is multimodal; proposal h(x) is normal"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_f0640173b2f7c82f.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1c783460b75b48e2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp"
width="760"
height="275"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림에서 파란색이 우리가 알고 싶은 복잡한 분포 $f(x)$ (두 봉우리), 빨간색이 우리가 sampling에 쓸 proposal 분포 $h(x)$ (정규분포).&lt;/p&gt;
&lt;h2 id="알고리즘--acceptance-rejection-반복"&gt;알고리즘 — Acceptance-Rejection 반복&lt;/h2&gt;
&lt;h3 id="step-1-reject--첫-시도가-실패하는-경우"&gt;Step 1. Reject — 첫 시도가 실패하는 경우&lt;/h3&gt;
&lt;p&gt;정규분포를 따르는 $h(x)$ 에서 한 data point를 뽑았는데 우연히 이 위치가 뽑혔다고 가정하자.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;lt; h(x): reject"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_24dd43d88b20fccd.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_82d2c0555e086f6.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp"
width="760"
height="251"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이때 $f(x) &lt; h(x)$ (&amp;ldquo;하트가 음수&amp;rdquo;) 이면 해당 data point는 &lt;strong&gt;reject&lt;/strong&gt; 하고, 같은 정규분포에서 data를 다시 추출한다.&lt;/p&gt;
&lt;h3 id="step-2-accept"&gt;Step 2. Accept&lt;/h3&gt;
&lt;p&gt;새로 추출한 data point에서 $f(x) &gt; h(x)$ 이므로 &lt;strong&gt;accept&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;gt; h(x): accept"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_e7a0f5fc326b7264.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_eaf74a7241167b2e.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp"
width="760"
height="267"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-proposal-이동"&gt;Step 3. Proposal 이동&lt;/h3&gt;
&lt;p&gt;Accept하면 해당 data point를 중심으로 정규분포 $h(x)$ 를 다시 가정한다 (현재 위치로 proposal을 옮긴다).&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Move h(x) to the accepted point"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_97207ce6cd76a957.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_a2437b4e8a3581cf.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp"
width="760"
height="223"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-4-반복--random-walk"&gt;Step 4. 반복 — Random Walk&lt;/h3&gt;
&lt;p&gt;새로 가정한 정규분포에서 위와 같이 data point를 다시 무작위로 뽑는다.&lt;/p&gt;
&lt;p&gt;그런데 $f(x) &gt; h(x)$ 이면 해당 data를 accept하고 다시 그 지점으로 이동해 새 정규분포를 가정한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Walk along the chain, accumulating accepted points"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_604ec4fc25bc7e49.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_99a80589654ba2e9.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp"
width="760"
height="215"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-5-다른-봉우리로-이동"&gt;Step 5. 다른 봉우리로 이동&lt;/h3&gt;
&lt;p&gt;이런 식으로 acceptance-rejection을 반복하면서 accept된 data point들을 차곡차곡 모아 놓는다. 그러다 보면, 처음에 있던 오른쪽 봉우리뿐 아니라 &lt;strong&gt;왼쪽 봉우리에서도 data point가 추출&lt;/strong&gt;될 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Chain crosses to the other mode of f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_c2454a80e4a86f3b.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_3c1b9ac206db94c2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp"
width="760"
height="201"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-6-양쪽-봉우리-모두-탐험"&gt;Step 6. 양쪽 봉우리 모두 탐험&lt;/h3&gt;
&lt;p&gt;왼쪽 봉우리에서도 같은 acceptance-rejection을 반복한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Both modes get sampled over time"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_92f60f7f4363119.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_d5679dab51ef6ca3.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp"
width="760"
height="213"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="결과"&gt;결과&lt;/h2&gt;
&lt;p&gt;이런 식으로 알고리즘을 충분히 반복한 후 추출된 data point들의 히스토그램을 그리면 다음과 같은 모양을 띈다 — &lt;strong&gt;원래 $f(x)$ 의 분포와 흡사&lt;/strong&gt;하다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Histogram of accepted samples approximates f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_798fda3cd4801473.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_2f2c110255f9341b.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp"
width="760"
height="314"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 data point들의 평균을 구하면 $f(x)$ 의 표본 평균과 표본 분산을 얻을 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="보충-정확한-metropolis-hastings-채택-확률"&gt;보충: 정확한 Metropolis-Hastings 채택 확률&lt;/h2&gt;
&lt;p&gt;위 설명은 직관 중심이다. 실제 Metropolis-Hastings 알고리즘에서 &lt;strong&gt;새 점 $x'$ 을 채택할 확률&lt;/strong&gt;은 다음과 같다.&lt;/p&gt;
$$\alpha(x' \mid x) \;=\; \min\!\left\{1,\; \frac{f(x')\, q(x \mid x')}{f(x)\, q(x' \mid x)}\right\}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$f(\cdot)$ : 목표 분포 (target)&lt;/li&gt;
&lt;li&gt;$q(x' \mid x)$ : 현재 위치 $x$ 에서 다음 후보 $x'$ 을 제안하는 proposal density&lt;/li&gt;
&lt;li&gt;proposal이 대칭이면 ($q(x'\mid x) = q(x \mid x')$, 예: 평균이 현재 점에 있는 정규분포) &lt;strong&gt;Metropolis&lt;/strong&gt; 알고리즘이 되어 비율이 $f(x')/f(x)$ 로 단순해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &amp;ldquo;$f$ 가 큰 곳으로 이동하면 무조건 accept, $f$ 가 작은 곳으로 이동하면 비율만큼의 확률로 accept&amp;rdquo;. 위 직관 설명의 &amp;ldquo;f &amp;gt; h → accept, f &amp;lt; h → reject&amp;quot;는 이 채택 확률의 단순한 시각적 비유로 보면 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>