<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Acceptance-Rejection |</title><link>https://chaeniverse.github.io/tags/acceptance-rejection/</link><atom:link href="https://chaeniverse.github.io/tags/acceptance-rejection/index.xml" rel="self" type="application/rss+xml"/><description>Acceptance-Rejection</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>Acceptance-Rejection</title><link>https://chaeniverse.github.io/tags/acceptance-rejection/</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></channel></rss>