采样

本总结是是个人为防止遗忘而作,不得转载和商用。

 

带拒绝的采样

有时候我们会遇到这样的情况:目标函数的样本不好采样,比如:

     

      假设我们的目标函数的概率密度函数是上图中圆,“在圆内均匀采样”这个要求稍微有点麻烦(这个还简单,如果更复杂的图形那就“给出一个点是落在目标图像内”就可能十分十分难办了),那这时怎么办?一个比较简单的方法见下图:

           

      相对于“在圆内均匀采样”这个要求“在正方体内均匀采样”就方便多了,于是画个正方体使其“刚好包括”圆,这样在正方体内随便给一个点,然后看看,如果落在圆内就采纳,反之就pass。

PS:

为了方便说明将上图中的圆想象成圆心在原点处的单位圆,于是如果使用x = rand(r)*cos rand(2π),y = rand(r)*sin rand(2π) ,其中的方式是无法在圆内均匀采样的,这时获得的样本距离圆心越近就越密,越远越稀疏。

当然,如果就是想在圆内均匀采样的话,正确的方法是:

    rand(r) 改为 r*rand(1)-2 或者 rand(r2)-2

 

      不过这样一来会有一些样本被浪费/拒绝,于是这种就被称作带拒绝的采样

      下面再给个与实际应用更近一点的例子:

     

      如上图所示:红线是我们的目标函数的概率密度函数p(z),我们想对其采样,即“在p(z)内均匀采样”就不太方便了,于是这里就给了一个高斯函数q(z),然后通过调整q(z)的倍数k使得q(z)“刚好包括”p(z),然后就在q(z)中随便采一个点z0,然后算算z0是在p(z)的红线下(在范围内)还是在p(z)和q(z)之间(在范围外),如果在范围内,就采纳,反之PASS。

      PS:上面这个其实就是根据均匀分布得到正态分布。

Matropolis - Hastings算法

      这是一个著名的MCMC算法,其过程是这样。

      在刚才内容的基础上,假设我们想对f(x)进行均匀采样,但f(x)太不好采了,那怎么做呢?

      这里假定在t时刻已经采好了样本x(t),那接下来就要想办法采得下一个样本x(t+1),于是:

      1,准备一个好采样的条件分布g(x|x(t)),假设这是个方差为1的高斯分布(方差随便给)。

      2, 于是在给定x(t)的条件分布g(x|x(t))中采一个值x*。即:在N(x|x(t), 1) 中采一个值x*。

      3,计算M-H率:

          

      要求

           

      PS1:f(x) 是已知的,只不过太不好采样了而已。

      PS2:g(x(t)|x*),就是N(x=x(t)|x*, 1) 的值。

      4,从0~1之间随机取一个值s,如果s ≤ R(x(t), x*),就承认x* 是x(t+1),反之则让x(t+1) = x(t),即:

           

      5,最终得到的序列收敛于f(x)分布。

     

      而上面有个问题,即上面这样做是在下面这句话成立时才可以:满足f(x)的分布,则后面的采样值服从f(x)的分布。那这句话成立的依据是什么?

      为了方便说明我将x(t)写作x1,x(t+1)写作x2,用g(x2|x1)表示在已有x1的情况下得到x2的概率,于是“已有x1的情况下得到x2”结合上面的第三步和第四步就可以写成:

           f(x1)*g(x2|x1)*α

      当 R(x1, x2) ≤ 1时,α = R,反之 α = 1。

      偷个懒的话就可以写成:

          

      于是,如果R ≥ 1,就有:

          

      如果R ≤ 1,就有:

          

      发现无论怎么样总会有相同的结果,因此有这样的结论:满足f(x)的分布,则后面的采样值服从f(x)的分布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值