簡體   English   中英

R:使用重要性采樣進行蒙特卡洛集成

[英]R: monte carlo integration using Importance Sampling

我有一個整體來評估

      "x^(-0.5)" ; x in [0.01,1] 

為此,我正在使用重要性采樣MC:理論上說,必須使用近似PDF來計算期望值(幾乎可以肯定地收斂到積分的均值)

繪制給定的積分,和指數PDF,僅基於該地塊后,我選擇了rexpdexp生成PDF -我的代碼如下所示-

#Without Importance Sampling
set.seed(1909)
X <- runif(1000,0.01,1)
Y <- X^(-0.5)
c( mean(Y), var(Y) )

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dexp(x,rate=1.5)
f <- function(x) x^(-0.5)
X= rexp(1000,rate=1.5)
Y=w(X)*f(X)
c( mean(Y), var(Y) )

有人可以確認我的想法是否正確嗎? 如果錯了,我應該怎么做呢? 請闡明-我已經了解了理論,但是實踐證明對我來說是有問題的。

對於不是那么簡單的積分,

1.) f(x) = [1 + sinh(2x)ln(x)] ^-1我僅在觀察圖后才選擇正常的PDF = g(x) (均值= 0.5和SD = 5)作為近似值。 我為此編寫了類似的代碼,但是它說NaN是在重要性抽樣的情況下產生的。 (這在理想情況下意味着未定義的函數,但我不知道如何解決)。

2.) f(x,y) = exp(-x ^ 4-y ^ 4)

如何為上述函數選擇g(x,y)

通常,您的方法似乎是正確的,但是對於要集成的域,您必須格外小心。 在您的原始示例中,值rexp(1000, 1.5)大約20%大於1。函數dexp(x, rate=1.5)不是間隔[0,1]上的密度函數。 您必須除以pexp(1, rate=1.5) 因此,這就是我對重要性抽樣示例的處理方式:

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dexp(x,rate=1.5) * pexp(1, rate=1.5)
f <- function(x) x^(-0.5)
X <- rexp(1000,rate=1.5)
X <- X[X<=1]
Y <- w(X)*f(X)
c(mean(Y), var(Y))

在您的第二個示例中,相同的原因導致了問題。 您得到負X,因此得到log(X)的NA值。 此外,您的法線函數應以0.5為中心,且方差較小。 這是我的方法:

#Without Importance Sampling
set.seed(1909)
X <- runif(1000,0.01,1)
Y <- (1+sinh(2*X)*log(X))^(-1)
c(mean(Y), var(Y))

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dnorm(x, mean=0.5, sd=0.25) * (1-2*pnorm(0, mean=0.5, sd=0.25))
f <- function(x) (1+sinh(2*x)*log(x))^(-1)
X <- rnorm(1000, mean=0.5, sd=0.25)
Y1 <- w(X)
Y2 <- f(X)
Y <- Y1*Y2
Y <- Y[!(is.na(Y2)&Y1==0)]
c(mean(Y), var(Y))

在您的第二個示例中,我不太了解y是什么。 它只是一個常數嗎? 那么也許威布爾分布可能起作用。

編輯:關於您在評論中的其他問題。 (1)任何概率密度函數都應積分為1。因此dexp(x, rate=1.5)不是區間[0,1]上的密度函數,它僅積分為pexp(1, rate=1.5) 但是功能

dexp01 <- function(x, rate){
  dexp(x, rate=rate)/pexp(1, rate=rate)
}

實際上集成到1:

integrate(dexp, 0, 1, rate=1.5)
integrate(dexp01, 0, 1, rate=1.5)

這就是包含概率分布函數的理由。 如果您使用不同的間隔,例如[0.3,8],則必須相應地調整功能:

dexp0.3_8 <- function(x, rate){
  dexp(x, rate=rate)/(pexp(8, rate=rate)-pexp(0.3, rate=rate))
}
integrate(dexp0.3_8, 0.3, 8, rate=1.5)

(2)在這里,我選擇方差,以便rnorm(1000, .5, .25)中大約95%的值在從0到1的區間內(此區間之外的許多值肯定會增加方差)。 但是,我不確定這是分布函數的最佳選擇。 重要性函數的選擇是我不太熟悉的問題。 您可以在CrossValidated詢問 下一個問題也一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM