拒绝采样(rejection sampling)

来源:互联网 发布:iptables禁止端口访问 编辑:程序博客网 时间:2024/05/16 18:01

      这篇关于采样的文章主要根据prml和wiki来的。

      关于采样, 统计学中,有时我们需要获得某一个分布的样本, 比如我们想获得【0 1】之间几个均匀随机数, 就可以说对【0 1】之间的均匀分布进行采样。

      对于特定的分布, 有的我们可以从获得服从这个分布的样本, 比如一条街上每天交通事故的数量服从泊松分布, 我们把每天的数据收集起来,就可以得到服从这个分布的样本集。但有时直接采样有困难, 或者成本太高。所以,我们想办法用计算机来模拟采样。

    对于模拟采样,有很多方法, 我们这里主要说拒绝采样。

    首先我们假设可以对【0 1】之间的均匀分布进行采样。当然这个采样是比较简单的, 因为很多函数库都有随机函数, 虽然一般也是伪随机数。

   拒绝采样基于这样一个前提: 对一个随机变量取样, 等价于从这个变量所服从的密度函数下方的区域均匀取样。当然, 取样的结果是变量值,如果是一元变量, 取样后得到的是一元变量的值。

    对于一些密度函数p(z), 可能函数形式复杂, 我们难以直接取样, 但对于给定的z, 我们容易得到p(z)的值,那么我们可以尝试拒绝采样。

   

如上图所示, 我们要采样p(z),我们还需要一个建议分布q(z), q(z)满足两点:

1 我们容易从q(z)采样

2, 存在k使得kq(z)>= p(z) 对所有的z成立

下面是采样方法

1,从建议分布采样一个点z(x坐标点)

2,从这个x坐标的画一条垂直直线,知道建议分布的曲线

3,沿这条直线均匀采样, 也就是从0到建议分布的值, 如果在p(z)外面, 拒绝这个采样

可以看出来 , 当k比较小的时候, 可以提高采样成功率

实际中,大多数时候 p(z)并不是normalized, 也就是说p(z)下的区域面积不为1

这时候这个算法依然可以用,而且不用改

因为对p(z)的scale,并不会对x轴的造成影响


原创粉丝点击