<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Monte Carlo |</title><link>https://chaeniverse.github.io/tags/monte-carlo/</link><atom:link href="https://chaeniverse.github.io/tags/monte-carlo/index.xml" rel="self" type="application/rss+xml"/><description>Monte Carlo</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>Monte Carlo</title><link>https://chaeniverse.github.io/tags/monte-carlo/</link></image><item><title>Acceptance-Rejection Algorithm</title><link>https://chaeniverse.github.io/blog/acceptance-rejection/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/acceptance-rejection/</guid><description>&lt;h2 id="acceptance-rejection-algorithm"&gt;Acceptance-Rejection Algorithm&lt;/h2&gt;
&lt;p&gt;이전에는 A-R 알고리즘을 &amp;ldquo;균등분포를 씌우고 곡선 안쪽 점은 accept, 바깥은 reject&amp;rdquo; 정도로만 두루뭉술하게 알고 있었다. 이 글에서는 그 디테일한 로직을 단계별로 정리한다.&lt;/p&gt;
&lt;h2 id="셋업"&gt;셋업&lt;/h2&gt;
&lt;p&gt;지지구간 $[0,1]$ 위에 정의된 (그러나 직접 적분이 까다로운) 분포 $f(x)$ 에서 샘플을 뽑고 싶다.&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) on [0,1]"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_a3410b39f6f1eea5.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_4c0bab44b5a23d68.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp"
width="760"
height="613"
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;h3 id="step-1-x-축-샘플링"&gt;Step 1. x-축 샘플링&lt;/h3&gt;
&lt;p&gt;먼저 $x$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0,1)$ 에서 추출해 고정점으로 둔다.&lt;/p&gt;
&lt;h3 id="step-2-y-축-샘플링"&gt;Step 2. y-축 샘플링&lt;/h3&gt;
&lt;p&gt;각 $x$ 고정점에 대해, $y$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0, a)$ 에서 추출한다. 여기서 $a$ 는 $f(x)$ 의 최댓값 (또는 그 이상). 즉, 곡선 $f(x)$ 를 충분히 덮는 가로 $1 \times$ 세로 $a$ 직사각형 안에 점들을 흩뿌리는 것.&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="Sampling along the y-axis at a fixed x"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_e2effc87f567206d.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a60948387b633bc4.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp"
width="760"
height="695"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-accept--reject"&gt;Step 3. Accept / Reject&lt;/h3&gt;
&lt;p&gt;각 $(x, y)$ 점에 대해&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$y \le f(x)$ → &lt;strong&gt;accept&lt;/strong&gt; (곡선 안쪽 점)&lt;/li&gt;
&lt;li&gt;$y &gt; f(x)$ → &lt;strong&gt;reject&lt;/strong&gt; (곡선 바깥 점)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-4-모든-x에-대해-반복"&gt;Step 4. 모든 x에 대해 반복&lt;/h3&gt;
&lt;p&gt;위 과정을 모든 $x$-축 data point에 대해 반복한다. accept된 $(x, y)$ 점들의 &lt;strong&gt;$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 x-coordinates approximates f(x)"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_2bc8c1739cc87115.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_894a7a1bc842417f.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp"
width="760"
height="684"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;→ &lt;strong&gt;원래 $f(x)$ 의 분포에 잘 근사&lt;/strong&gt;된다.&lt;/p&gt;
&lt;h2 id="표본-통계량"&gt;표본 통계량&lt;/h2&gt;
&lt;p&gt;이 accepted data point들의 $x$-좌표 평균을 구하면 $f(x)$ 의 표본 평균을 추정할 수 있다 (분산도 마찬가지).&lt;/p&gt;
&lt;h2 id="왜-동작하나-직관"&gt;왜 동작하나 (직관)&lt;/h2&gt;
&lt;p&gt;곡선 $f(x)$ 아래 면적은 정확히 1 (확률밀도이므로). 직사각형 $[0,1] \times [0,a]$ 에 균등하게 점을 뿌리면, &lt;strong&gt;곡선 아래 영역에 떨어지는 비율&lt;/strong&gt;은 $\frac{1}{a}$. 그리고 이 영역 안의 점들은 &lt;strong&gt;곡선 아래에서 균등 분포&lt;/strong&gt;를 따른다.&lt;/p&gt;
&lt;p&gt;이때 $x$-좌표만 보면, 그 한계분포(marginal)가 정확히 $f(x)$ 가 된다.&lt;/p&gt;
&lt;p&gt;수식으로:&lt;/p&gt;
$$P(X \le x \mid \text{accepted}) = \frac{\int_0^x f(t)\,dt}{\int_0^1 f(t)\,dt} = \int_0^x f(t)\,dt = F(x)$$&lt;p&gt;→ accepted $X$ 의 CDF가 $F$ 이므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="일반화"&gt;일반화&lt;/h2&gt;
&lt;p&gt;지지구간이 $[0,1]$ 이 아니거나 $f$ 의 상한이 명확하지 않을 때는 임의의 proposal $g(x)$ 와 상수 $M$ 을 잡아 $f(x) \le M \cdot g(x)$ 를 만족시킨다. 그리고&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$X \sim g$ 에서 후보를 뽑고,&lt;/li&gt;
&lt;li&gt;$U \sim \mathrm{Unif}(0,1)$ 을 뽑아,&lt;/li&gt;
&lt;li&gt;$U \le \dfrac{f(X)}{M \cdot g(X)}$ 이면 accept, 아니면 reject.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이때 accept된 $X$ 가 정확히 $f(x)$ 분포를 따른다. 위에서 다룬 케이스는 $g(x) = 1$ (균등 분포), $M = a$ 인 특수 경우에 해당한다.&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><item><title>Importance Sampling</title><link>https://chaeniverse.github.io/blog/importance-sampling/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/importance-sampling/</guid><description>&lt;h2 id="monte-carlo"&gt;Monte Carlo&lt;/h2&gt;
&lt;p&gt;기댓값을 계산하는 방법. $X \sim f(x)$ 일 때 $g(X)$ 의 기댓값은 다음 세 가지 형태로 동치다.&lt;/p&gt;
$$\underbrace{E[g(X)]}_{\text{①}} \;=\; \underbrace{\int g(x) f(x)\,dx}_{\text{②}} \;\approx\; \underbrace{\frac{1}{n}\sum_{i=1}^{n} g(x_i)}_{\text{③}}$$&lt;p&gt;①, ②는 정의상 같고, ③은 $f$ 에서 뽑은 샘플 $\{x_i\}$ 의 평균으로 ②를 근사한 것 (대수의 법칙).&lt;/p&gt;
&lt;h3 id="예제-1-단순-mc"&gt;예제 1: 단순 MC&lt;/h3&gt;
&lt;p&gt;$g(x) = e^{-2x}$, $X \sim \mathrm{Unif}(0,1)$ 일 때 $E[g(X)]$ 을 구하라.&lt;/p&gt;
&lt;p&gt;이때 $f(x) = 1$ (Unif(0,1) 의 밀도)이므로&lt;/p&gt;
$$E[g(X)] = \int_0^1 e^{-2x}\,dx \;\approx\; \frac{1}{N}\sum_{i=1}^{N} e^{-2 x_i}, \qquad x_i \sim \mathrm{Unif}(0,1)$$&lt;p&gt;균등 분포에서 $N$ 개를 뽑아 $g$ 에 넣고 평균을 내면 끝.&lt;/p&gt;
&lt;h2 id="importance-sampling"&gt;Importance Sampling&lt;/h2&gt;
&lt;p&gt;문제는 다음 두 경우다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$f(x)$ 에서 샘플링이 어렵다.&lt;/strong&gt; 닫힌 형태로 sampling이 안 되는 분포.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$g(x) \cdot f(x)$ 가 $f$ 의 꼬리/희소 영역에 몰려 있다.&lt;/strong&gt; $f$ 에서 뽑은 대부분의 샘플이 $g \cdot f$ 가 큰 영역을 못 맞춰서 분산이 매우 커진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이럴 때는 다른 분포 $\phi(x)$ (&amp;ldquo;proposal&amp;rdquo; 또는 &amp;ldquo;importance distribution&amp;rdquo;)에서 샘플을 뽑고 가중치로 보정한다. 핵심 항등식:&lt;/p&gt;
$$E_f[g(X)] = \int g(x) f(x)\,dx = \int g(x) \cdot \frac{f(x)}{\phi(x)} \cdot \phi(x)\,dx = E_\phi\!\left[g(X) \cdot \frac{f(X)}{\phi(X)}\right]$$&lt;p&gt;→ $\phi$ 에서 샘플 $\{x_i\}$ 을 뽑고&lt;/p&gt;
$$E_f[g(X)] \;\approx\; \frac{1}{N}\sum_{i=1}^{N} g(x_i) \cdot \underbrace{\frac{f(x_i)}{\phi(x_i)}}_{\text{weight}}$$&lt;p&gt;여기서 $f(x)/\phi(x)$ 가 &lt;strong&gt;importance weight&lt;/strong&gt;. (이 가중치 때문에 &amp;ldquo;importance&amp;rdquo; sampling이라는 이름이 붙은 것)&lt;/p&gt;
&lt;h2 id="예제-2"&gt;예제 2: $\int (x-1)(x-2)\,dx$&lt;/h2&gt;
&lt;p&gt;이 식은 따로 정해진 $f(x)$ 가 없다 (단순 적분). $\phi(x) \sim \mathrm{Exp}(1)$, 즉 $\phi(x) = e^{-x}$ ($x&gt;0$) 를 proposal로 쓰자.&lt;/p&gt;
$$\int (x-1)(x-2)\,dx = \int \underbrace{\frac{(x-1)(x-2)}{e^{-x}}}_{\text{new } g(x)} \cdot \underbrace{e^{-x}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim \mathrm{Exp}(1)$ 에서 $N$ 개를 뽑아 새 $g$ 에 넣고 평균:&lt;/p&gt;
$$\widehat{E[g(X)]} = \frac{1}{N}\sum_{i=1}^{N} \frac{(x_i-1)(x_i-2)}{e^{-x_i}}, \qquad x_i \sim \mathrm{Exp}(1)$$&lt;h2 id="예제-3--with--proposal"&gt;예제 3: $\int e^{-|x|}\,dx$ with $N(0,1)$ proposal&lt;/h2&gt;
&lt;p&gt;$\phi(x) \sim N(0,1)$, 즉 $\phi(x) = \dfrac{1}{\sqrt{2\pi}} e^{-x^2/2}$ 를 쓰자.&lt;/p&gt;
$$\int e^{-|x|}\,dx = \int \underbrace{\frac{e^{-|x|}}{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}}_{\text{new } g(x)} \cdot \underbrace{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim N(0,1)$ 에서 $N$ 개 sampling 후 새 $g$ 에 넣어 평균을 구하면 된다.&lt;/p&gt;
&lt;h2 id="왜--을-proposal로-골랐나"&gt;왜 $N(0,1)$ 을 proposal로 골랐나&lt;/h2&gt;
&lt;p&gt;원래의 $g(x) = e^{-|x|}$ 는 0 근처에 봉우리가 있는 양옆 대칭 함수다. $\phi(x) \sim N(0,1)$ 도 비슷한 모양 — 0 근처에 봉우리, 양쪽으로 빠르게 감소.&lt;/p&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;strong&gt;proposal $\phi(x)$ 를 $|g(x) f(x)|$ 와 모양이 비슷하게 잡으면 분산이 작아져 효율이 좋다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;만약 $\phi$ 가 $|g \cdot f|$ 가 큰 영역을 거의 안 덮으면, 거의 모든 샘플의 weight $f(x)/\phi(x)$ 가 0 근처가 되고, 가끔 한 샘플의 weight가 매우 커져서 추정량의 분산이 폭발한다.&lt;/p&gt;
&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&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;strong&gt;샘플링은 $\phi$ 에서, 평균은 weight $f/\phi$ 로 보정.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Proposal $\phi$ 의 모양을 신경써서 고를수록 추정량의 분산이 작아진다.&lt;/p&gt;
&lt;/blockquote&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><item><title>Inverse Sampling</title><link>https://chaeniverse.github.io/blog/inverse-sampling/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/inverse-sampling/</guid><description>&lt;h2 id="inverse-sampling"&gt;Inverse Sampling&lt;/h2&gt;
&lt;p&gt;분포 $f(x)$ 에서 직접 샘플링하기 어려울 때 쓰는 기법. CDF의 역함수 $F^{-1}$ 과 균등 분포만 있으면 어떤 분포든 (이론적으로는) 뽑을 수 있다.&lt;/p&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;$f(x)$ 의 CDF $F(x) = \displaystyle\int_{-\infty}^{x} f(t)\,dt$ 를 구한다.&lt;/li&gt;
&lt;li&gt;$F$ 의 역함수 $F^{-1}$ 을 구한다.&lt;/li&gt;
&lt;li&gt;균등 분포에서 $u \sim \mathrm{Unif}(0,1)$ 을 뽑는다.&lt;/li&gt;
&lt;li&gt;$x = F^{-1}(u)$ 로 변환하면 $x \sim f(x)$ 이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;샘플링한 $u$ 들을 $F^{-1}$ 에 넣은 후 히스토그램으로 그리면 $f(x)$ 의 분포에 근사한다.&lt;/p&gt;
&lt;h2 id="왜-동작하나-간단-증명"&gt;왜 동작하나 (간단 증명)&lt;/h2&gt;
&lt;p&gt;$U \sim \mathrm{Unif}(0,1)$ 이라 하자. $X = F^{-1}(U)$ 의 CDF를 계산하면&lt;/p&gt;
$$P(X \le x) = P(F^{-1}(U) \le x) = P(U \le F(x)) = F(x)$$&lt;p&gt;마지막 등호는 $U$ 가 $[0,1]$ 균등 분포이기 때문 ($P(U \le t) = t$). 즉 $X$ 의 CDF가 $F$ 와 같으므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="기하학적-직관"&gt;기하학적 직관&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 한쪽으로 치우친 분포라고 하자 (예: $0$ 근처에 mass가 몰린 감소하는 밀도).&lt;/li&gt;
&lt;li&gt;$F^{-1}$ 은 $u$-축의 균등한 구간을 $x$-축의 &lt;strong&gt;불균등한 구간&lt;/strong&gt;으로 매핑한다.
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 큰 영역 → $F$ 가 가파르게 증가 → $F^{-1}$ 은 완만 → 좁은 $x$ 구간이 넓은 $u$ 구간에 대응&lt;/li&gt;
&lt;li&gt;$f(x)$ 가 작은 영역 → $F$ 가 느리게 증가 → $F^{-1}$ 은 가파름 → 넓은 $x$ 구간이 좁은 $u$ 구간에 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 균등 분포 $u$ 를 뽑아 $F^{-1}$ 에 넣으면, &lt;strong&gt;밀도가 높은 $x$ 영역에는 많은 샘플이, 낮은 영역에는 적은 샘플이&lt;/strong&gt; 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예: $u$ 를 10개 뽑아 $F^{-1}$ 에 넣으면, 결과 히스토그램이 원본 $f(x)$ 와 닮아간다.&lt;/p&gt;
&lt;h2 id="한계"&gt;한계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$F^{-1}$ 을 닫힌 형태로 구할 수 있어야 깔끔하게 쓸 수 있다 (지수, 균등, 로지스틱 등).&lt;/li&gt;
&lt;li&gt;닫힌 형태 $F^{-1}$ 이 없거나 다변량으로 확장하기 어려울 때는 &lt;strong&gt;Rejection sampling&lt;/strong&gt;, &lt;strong&gt;MCMC&lt;/strong&gt; (Gibbs, Metropolis-Hastings) 등 다른 기법을 쓴다.&lt;/li&gt;
&lt;/ul&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>