拒绝接受采样(R语言实现)

与其他采样最不同的点,拒绝接受采样无需利用积分计算的思想。比如有一个复杂分布f(x),我们可以从好采样的分布中采样(比如均匀分布),然后依据一定的原则去拒绝或接受好采样的分布产生的一些样本值。使得接受的样本值可以合理的来自于分布f(x),其思想称之为拒绝接受采样。

假定有一分布 h ( x ) h(x) h(x)使得 h ( x ) h(x) h(x)恒大于 f ( x ) f(x) f(x),如下图所示:
在这里插入图片描述
随机取得点x1,再给定第二个维度,使得对于点x1的第二个维度为0到h(x1)的均匀分布如下:
在这里插入图片描述
若点x1在第二个维度上低于f(x)(绿色)则接受该样本点,否则拒绝该样本点(红色)

因此接受x1的机率与f(x1)的高度成正比,即随机变量X在点x1处的密度:
在这里插入图片描述
接下来可以生成一系列样本点,即可求得f(x)的密度
在这里插入图片描述
接下来对h(x)进行修正:

因为如上的拒绝接受形式效率不高。

因此可以找到更一般的均匀分布g(x)

定义m使得

m = m a x ( f ( x ) g ( x ) ) m=max\left(\frac{f(x)}{g(x)}\right) m=max(g(x)f(x))

h ( x ) = m g ( x ) h(x)=mg(x) h(x)=mg(x)

能确保

h ( x ) ≥ f ( x ) 对于任意的点x h(x)\ge f(x)\text{对于任意的点x} h(x)f(x)对于任意的点x

(注:在实际应用中并不一定要求m取到精确的 m = m a x ( f ( x ) g ( x ) ) m=max\left(\frac{f(x)}{g(x)}\right) m=max(g(x)f(x)),比最大值要大也可,只是效率没有精确的最大值来的高)
在这里插入图片描述
总结下拒绝接受采样生成来自于f(x)的随机变量的步骤:

1.从g(x)中采样生成随机样本x1。

2.从均匀分布U(0,mg(x1))生成第二个维度的随机变量u。

3.若mg(x1)<f(x1),则落在f(x)内(绿色的点),此时接受点x1,认为此点来自于f(x),否则拒绝,之后重复第一个步骤,生成一系列来自于f(x)的点。

若令U为0~1上的均匀分布,则等价于

U < f ( X 1 ) m g ( X 1 ) 时接受 U<\frac{f(X_1)}{mg(X_1)}\text{时接受} U<mg(X1)f(X1)时接受

最终可算得:

P ( a c c ∣ X ) = P ( U < f ( X ) m g ( X ) ∣ X ) = f ( X ) m g ( X ) P(acc|X)=P(U<\frac{f(X)}{mg(X)}|X)=\frac{f(X)}{mg(X)} P(accX)=P(U<mg(X)f(X)X)=mg(X)f(X)

那么因此总的接受概率为:

∑ x P ( a c c ∣ x ) P ( X = x ) = ∑ x f ( x ) m g ( x ) g ( x ) = 1 m \sum_xP(acc|x)P(X=x)=\sum_x\frac{f(x)}{mg(x)}g(x)=\frac{1}{m} xP(accx)P(X=x)=xmg(x)f(x)g(x)=m1

m越小,总的接受概率越大则由g(x)产生的点更容易被视作为来自于f(x),因此采样效率越高。

R语言实践

从beta(2,2)中采样 f ( x ) = 6 x ( 1 − x ) ,     0 < x < 1 f(x)=6x(1-x),\ \ \ 0<x<1 f(x)=6x(1x),   0<x<1

g ( x ) ∼ U ( 0 , 1 ) g(x)\sim U(0,1) g(x)U(0,1)

此时m=3/2

则当:

4 x ( 1 − x ) > u 时接受样本x 4x(1-x)>u\text{时接受样本x} 4x(1x)>u时接受样本x

#像产生来自beta(2,2)样本数
n <- 1000
#接受次数
k <- 0
#迭代次数
j <- 0
y <- numeric(n)
while(k<n){
  u <- runif(1)
  j <- j+1
  #从g(x)中采样
  x <- runif(1)
  if(4*x*(1-x)>u){
    #接受样本,认为从建议分布中生成的样本等价于从目标分布中生成的样本
    k <- k+1
    y[k] <- x
  }
}
cat("当m=3/2时,从建议分布中产生beta(2,2)的1000个样本共需迭代次数:",j)

比较拒绝接受采样与实际采样之间的差异

p <- seq(.1,.9,.1)
#拒绝接受的实际采样点
Qhat <- quantile(y,p)
#理论
Q <- qbeta(p,2,2)
round(rbind(Qhat, Q), 3)

在这里插入图片描述
可以看到拒绝接受采样获得数据与实际beta(2,2)的数据相差不大,并且当我们调整样本量n更大,会产生更为精确的拒绝接受采样的样本。

当然若取得的m比精确最大值m还大,也是可以的,只是会影响采样效率,比如我们取得m=6

此时
x ( 1 − x ) > u 时接受样本x x(1-x)>u\text{时接受样本x} x(1x)>u时接受样本x

#样本数
n <- 1000
#接受次数
k <- 0
#迭代次数
j <- 0
y <- numeric(n)

while(k<n){
  u <- runif(1)
  j <- j+1
  #从g(x)中采样
  x <- runif(1)
  if(x*(1-x)>u){
    #接受样本
    k <- k+1
    y[k] <- x
  }
}
j
p <- seq(.1,.9,.1)
#实际
Qhat <- quantile(y,p)
#理论
Q <- qbeta(p,2,2)
round(rbind(Qhat, Q), 3)

在这里插入图片描述
随m的增加,采样的效率变低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计包

谢谢您的赞赏,祝您安康

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值