Metropolis-Hastings Algorithm
Metropolis-Hastings Algorithm
https://en.wikipedia.org/wiki/Metropolis–Hastings_algorithm
已知一个连续pdf, $P(x)$, 如何从中取样?
最直接的方法是求出cdf, $F(x)$, 然后使用$F^{-1}(U)$来取样, U是一个取自$Unifrom(0,1)$的随机变量.
如果cdf不太好求,一种方式是通过rejection sampling来在pdf上直接取样,这种方法可能出现的问题是拒绝率太高,导致取样速度很慢.
Metropolis algorithm是使用Markov Chain Monte Carlo(MCMC)想法来取样.取样速度很快,但也有他自身的问题:
- 需要一个burn-in的预热过程.
- 连续样本直接是相互依赖的,仅保证最终sample set是符合目标分布的.
Metropolis把pdf的support set想象成随机过程中的状态集,$P(x)$就是每个状态被访问的概率,那么状态转移概率为$P(x_{i+1} \mid x_i)$.
如果我们已经知道了$P(x_{i+1} \mid x_i)$,那么可以很容易的使用使用MCMC来取样$P(x)$.
Initialize $x_0$
For $i = 1, \dots, n$
$x_i \sim P(x_{i} \mid x_{i-1})$
构造$P(x’ \mid x)$只需要满足以下条件的:
\[\frac{P(x' \mid x)}{P(x \mid x')} = \frac{P(x')}{P(x)}\]假设我们可从分布$g(x’ \mid x)$中取样,那么我们添加转移成功率$A(x’, x)$来修正$g(x’ \mid x)$.
\[P(x' \mid x) = g(x' \mid x) A(x',x)\]那么,
\[\frac{A(x',x)}{A(x,x')} = \frac{P(x')}{P(x)} \frac{g(x \mid x')}{g(x' \mid x)}\]现在我们构造$A(x’,x)$, Metropolis的方式是,让大的那个等于1, $\max(A(x’,x),A(x,x’))= 1$.
最后得到
\[A(x',x) = \min(1, \frac{P(x')}{P(x)} \frac{g(x \mid x')}{g(x' \mid x)})\]算法:
Initialize $x_0$
For $i = 1, \dots, n$
$x_i \sim g(x_i \mid x_{i-1})$
$p_i = \min(1,\frac{P(x')}{P(x)} \frac{g(x \mid x')}{g(x' \mid x)})$
$u_i \sim Uniform(0,1)$
If $u_i > p_i$
$x_i = x_{i-1}$
如果我们取$g(x’ \mid x)$为以x为均值的正态分布, 即$g(x’ \mid x) = Normal(x,1)$, 那么$g(x’ \mid x) = g(x \mid x’)$, 得到
\[x_i \sim Normal(x,1) \\ p_i = \min(1,\frac{P(x')}{P(x)})\]