You are on page 1of 4

贝叶斯HW5

T1 (10.4)
(A)

假设 由 采样获得,

如果

(B)

依然需要满足 因为上述证明过程中需要依赖

如果 无上界,则无法找到合适的 满足该条件。

T2
(1)取 ,因为,考虑到标准正态分布基本不可能超出

[-10,10]的范围,使用该范围的均匀分布作为 ,此范围内满足 。

代码:

rmynorm <- function(n) {


 y <- rep(0,n)   # a vector to store the values that we will generate
 c <- 20* sqrt(0.5 / pi)    # the 'c' in Acceptance-Rejection approach, i.e.
f(x) <=cg(x).
 
 count = 0 # 记录抽样次数
 for(i in 1:n) {
   accept <- F
   while (!accept) {
     x <- runif(1, -10,10)    # 利用均匀分布生成
     r <- sqrt(0.5 / pi) * exp(-x*x/2) / (c * 1/20)
     accept <- (runif(1) <= r)
     count <- count + 1
  }
   y[i] <- x
}
 c(y,count)
}

a = rmynorm(1000)
b = a[1001] # 抽样次数,用于(4)小题,=8099
a = a[1:1000]
# 验证正态性
qqplot(a, rnorm(1000))
qqline(rnorm(1000))
# 求解
sum(a > 0 & a < 2) / 1000

结果为:0.479,基本符合预期。

(2)考虑到标准正态分布基本不可能超出[-10,10]的范围,使用该范围的均匀分布作为 。

rmynorm2 <- function(n) {


 y <- rep(0,n)   # a vector to store the values that we will generate
 w <- rep(0,n)
 g <- 1/ 20
 for(i in 1:n) {
   x <- runif(1, -10,10)    # 利用均匀分布生成
   r <- sqrt(0.5 / pi) * exp(-x*x/2) / g
   y[i] <- x
   w[i] <- r
}
 return(c(y,w))
}
result <- rmynorm2(1000)
y = result[1:1000]
w = result[1001:2000]
# 求解
weighted.mean(y > 0 & y < 2, w) # 0.4864142

# n_eff
1000/mean(w * w) #189.8226

结果为:0.4864142,基本符合预期。

(3)通过上述代码,可计算得到有效样本量189.8226

(4)

(1),(2)均是无偏的。

(1)中使用8099次抽样获得1000个有效样本;(2)中使用1000次抽样获得189.8226个有效样本。

同样使用[-10,10]的均匀分布作为 。相对而言,要获得同样数量的有效样本,(2)的效率更高,更倾
向选择(2)。

T3
(1)
考虑到相切于 即 在 时取到最大值

于是有

假设

带入 有

经验证, 恒成立且在 时取等,所以正确。

其中,

(2)结果为0.7050873。

rf <- function(n) {
 y <- rep(0,n)   # a vector to store the values that we will generate
 c <- 2 * exp(1/8)   # the 'c' in Acceptance-Rejection approach, i.e. f(x)
<=cg(x).
 for(i in 1:n) {
   accept <- F
   while (!accept) {
     x <- rexp(1, 0.5)
     # 利用均匀分布生成0-2的指数分布
     r <-  exp(-x*x/2) / c / (0.5 * exp(-0.5 * x))
     accept <- (runif(1) <= r & x < 2)
  }
   y[i] <- x
}
 c(y)
}
a = rf(10000)
mean(a)

T4
结果为0.7136872。和T3结果较为接近。

rf2 <- function(n) {


 y <- rep(0,n)   # a vector to store the values that we will generate
 w <- rep(0,n)
 for(i in 1:n) {
   x <- runif(1, 0, 2)    # 利用均匀分布
   r <- exp(-x*x/2)
   y[i] <- x
   w[i] <- r
}
 return(c(y,w))
}
a = rf2(10000)
y = a[1:10000]
w = a[10001:20000]

weighted.mean(y, w)

You might also like