如果我们要求$f(x)$的积分,可化成,
\[\int {\frac{ {f(x)}}{ {p(x)}}p(x)dx} \]
$p(x)$是x的概率分布,假设${g(x) = \frac{ {f(x)}}{ {p(x)}}}$,然后在$p(x)$的分布下,抽取x个样本,当n足够大时,可以采用均值来近似$f(x)$的积分,
\[\int {f(x)dx} \approx \frac{ {g({x_1}) + g({x_2}) + ... + g({x_n})}}{n}\]
1. 接受-拒绝采样
就算我们已知$p(x)$的分布,也很难得到一堆符合$p(x)$分布的样本$\{ {x_1},{x_2},...,{x_n}\} $来带入$g(x)$。
既然$p(x)$太复杂在程序中没法直接采样,那么我们设定一个程序可抽样的分布$q(x)$比如高斯分布,然后按照一定的方法拒绝某些样本,达到接近$p(x)$分布的目的,这就是接受拒绝采样。
接受拒绝采样具体操作如下,设定一个方便抽样的函数$q(x)$,以及一个常量k,使得已知的分布$p(x)$(红线)总在$kq(x)$(蓝线)的下方,
从方便抽样的$q(x)$分布抽样得到$z_0$
从均匀分布$\left( {0,kq\left( { {z_0}} \right)} \right)$抽样得到$u_0$
如果$u_0$刚好落到灰色区域,拒绝这次采样,否则接受这次采样$x_t=z_0$
重复以上过程,得到接近$p(x)$分布的样本$\{ {x_1},{x_2},...,{x_n}\} $
在高维的情况下,接受-拒绝采样会出现两个问题,第一是合适的$q(x)$分布比较难以找到,第二是很难确定一个合理的 k 值。这两个问题会导致拒绝率很高,无用计算增加。
2. MCMC蒙特卡洛采样
这里我们需要引入马尔科夫链来帮忙,后面的几种采样方法都是基于马尔科夫链的,如果不想明白原理的话,这边一段都可以跳过。
可以参照马尔科夫细致平稳条件
我们的马尔科夫链模型的状态转移矩阵收敛到的稳定概率分布与我们的初始状态概率分布无关。这是一个非常好的性质,也就是说,如果我们得到了这个稳定概率分布$p(x)$对应的马尔科夫链模型的状态转移矩阵$P$,则我们可以用任意的概率分布样本$q_{0}(x)$开始,带入马尔科夫链模型的状态转移矩阵$P$,这样经过一些序列的转换,${q_0}\mathop \to \limits^P {q_1}\mathop \to \limits^P {q_2}...\mathop \to \limits^P {q_z}$,最终就可以得到符合对应稳定概率分布的样本${q_z} = \{ {x_1},{x_2},...,{x_n}\} $。
马尔科夫链采样具体过程总结如下,输入马尔科夫状态转移矩阵P,需要样本个数n,
从任意简单概率分布得到样本${q_0} = \{ {x_1},{x_2},...,{x_n}\}$开始
对样本$q_t$中的每一个样本$x_i$,利用状态转移矩阵P,${x_i} \times P$,求得转移后的$q_{t+1}$
达到终止条件&#x