Rejection sampling 笔记

来源:互联网 发布:java中常用的数据结构 编辑:程序博客网 时间:2024/06/05 16:29

拒绝抽样,直观地理解,为了得到一个分布的样本,我们通过某种机制得到了很多的初步样本,然后其中一部分初步样本会被作为有效的样本(即要抽取的分布的样本),一部分初步样本会被认为是无效样本舍弃掉。这个算法的基本思想是:我们需要对一个分布f(x)进行采样,但是却很难直接进行采样,所以我们想通过另外一个容易采样的分布g(x)的样本,用某种机制去除掉一些样本,从而使得剩下的样本就是来自与所求分布f(x)的样本。

它有几个条件:1)对于任何一个x,有f(x)<=M*g(x); 2) g(x)容易采样;3) g(x)最好在形状上比较接近f(x)。具体的采样过程如下:

1. 对于g(x)进行采样得到一个样本xi, xi ~ g(x);

2. 对于均匀分布采样 ui ~ U(a,b);

3. 如果ui<= f(x)/[M*g(x)], 那么认为xi是有效的样本;否则舍弃该样本; (# 这个步骤充分体现了这个方法的名字:接受-拒绝)

4. 反复重复步骤1~3,直到所需样本达到要求为止。

以上摘自http://www.cnblogs.com/longdouhzt/archive/2012/09/14/2684770.html




g(x)称为 proposal distribution.
g(x)不一定什么时候都比f(x)大, 因为g(x)是一个分布,积分之和等于1。f(x)也是。
构建g(x)的时候可以使用f(x)乘以一个常数,即上面的M,这样f(x)会比g(x)小。

在这条线(红的加绿的)上做均匀分布的采样,红的就拒绝,绿的就接受。
如果g(x)选择不好的时候 接受率很差

对rejection sampling的改进就是 Adaptive rejection sampling

ARS 只有 f(x) 是 concave 的时候才能用
ARS随机选择几个点 然后在logf(x) 上做以这几个点做切线。log space上如果是切线的话  在原space上就是 exponetial 函数。
这些exponential函数可以把原来的 f(x) 包裹起来。
采样点越多 包的约紧。


重要性采样 Importance sampling
求E(x) -> p(z)/q(z)(这个就是Importance weights) 是这个分布相对于q(z)来说的重要度。
重要性采样时 会一直接受 但是有些地方的重要性会非常低。
最后用重要性来选择sampling的点。


0 0
原创粉丝点击