我已经提到这些链接 - here和here。后一个链接是我的一个问题,但结果并不完全正确。
因此,我正在创建一个问题,尝试回答它的新尝试。
我有以下积分
(x^-0.5) ;in x=[0.01,1]
要使用重要性采样MC集成解决此问题,需要选择与功能图
我的R代码解决了同样的问题:
#function 1 - importance sampling
w <- function(x) dunif(x,0.01,1)/dbeta(x,0.7,1)
f <- function(x) x^(-0.5)
X <- rbeta(1000,0.7,1)
Y <- w(X)*f(X)
c(mean(Y),var(Y))
真正的积分值 - 1.8
使用上面的重要性采样代码 - 1.82(我的重要性PDF是 Beta(0.7,1)
这很好,所以我假设代码是正确的。
现在我有了这个整体
[1+sinh(2x)ln(x)]^-1 ;in x=[0.8,3]
我的代码是:
#function 2
w <- function(x) dunif(x,0.01,1)/dnorm(x,0.5,0.25)
f <- function(x) (1+sinh(2*x)*log(x))^(-1)
X <- rnorm(1000,0.5,0.25)
Y <- w(X)*f(X)
Y <- Y[!is.na(Y)]
c(mean(Y),var(Y))
真积分值 ~0.601
执行上述代码的价值 ~3.25(我的重要性PDF 正常(0.5,sd = 0.25)
我做错了什么?
1)将函数评估为f(x)。
2)从重要性PDF g(x)生成在间隔之间截断的样本。
3)得到平均值(f(x)/ g(x)),这是积分。
EDITS
根据Nishanth的建议,代码中的更改如下:
set.seed(19)
w <- function(x) dunif(x,0.8,3)/dnorm(x,0.8,1.49)
f <- function(x) (1+sinh(2*x)*log(x))^(-1)
X <- rnorm(1000,0.8,1.49)
X <- X[X > 0.8 & X < 3]
Y <- w(X)*f(X)
c(mean(Y),var(Y))
然而,即使估计接近实际值,也不会发生方差减少(与强力MC和分层抽样相比)
此外,如果有人想验证重要性PDF的选择,则上传要集成的功能的图。
答案 0 :(得分:1)
重量函数的选择在重要性抽样中起着至关重要的作用。为了获得更快的收敛,必须调整参数 - 当不存在适当的反函数时,这主要是临时的。我会对您的代码进行以下更改:
> w <- function(x) dunif(x,0.3,8)/dnorm(x,0.3,0.4)
> f <- function(x) (1+sinh(2*x)*log(x))^(-1)
> X <- rnorm(1000,0.3,0.4)
> X <- X[X > 0.3 & X < 8]
> Y <- w(X)*f(X)
> c(mean(Y),var(Y))
[1] 0.703766099 0.005848816