Answers:
有一个简单的(且如果我可以添加,优雅)解决了这个运动:自出现像两个存活分布的产物:
关联的R代码非常简单
x=pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))) #simulating an n-sample
并且绝对比逆pdf和accept-reject分辨率快得多:
> n=1e6
> system.time(results <- Vectorize(simulate,"prob")(runif(n)))
utilisateur système écoulé
89.060 0.072 89.124
> system.time(x <- simuF(n,1,2,3))
utilisateur système écoulé
1.080 0.020 1.103
> system.time(x <- pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))))
utilisateur système écoulé
0.160 0.000 0.163
毫不奇怪的完美配合:
您总是可以用数值方法求解逆变换。
下面,我做一个非常简单的二等分搜索。对于给定的输入概率(由于您的公式中已经有,所以我使用),我从和。然后我将直到。最后,我将等距直到其长度小于且其中点满足。
对于我对和选择,ECDF非常适合您的,并且速度相当快。您可能可以通过使用某些Newton型优化而不是简单的二等分搜索来加快速度。
aa <- 2
bb <- 1
pp <- 0.1
cdf <- function(x) 1-exp(-aa*x-bb*x^(pp+1)/(pp+1))
simulate <- function(prob,epsilon=1e-5) {
left <- 0
right <- 1
while ( cdf(right) < prob ) right <- 2*right
while ( right-left>epsilon ) {
middle <- mean(c(left,right))
value_middle <- cdf(middle)
if ( value_middle < prob ) left <- middle else right <- middle
}
mean(c(left,right))
}
set.seed(1)
results <- Vectorize(simulate,"prob")(runif(10000))
hist(results)
xx <- seq(0,max(results),by=.01)
plot(ecdf(results))
lines(xx,cdf(xx),col="red")
如果通过接受拒绝直接解决问题,则有些费解。首先,简单的区分表明分布的pdf为
其次,由于
我们有上限
第三,考虑的第二项,取变量,即。然后
是变量变化的雅可比行列式。如果
因此,接受拒绝算法的R渲染是
simuF <- function(a,b,p){
reepeat=TRUE
while (reepeat){
if (runif(1)<.5) x=rexp(1,a) else
x=rexp(1,b/(p+1))^(1/(p+1))
reepeat=(runif(1)>(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
(a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1))))}
return(x)}
对于n样本:
simuF <- function(n,a,b,p){
sampl=NULL
while (length(sampl)<n){
x=u=sample(0:1,n,rep=TRUE)
x[u==0]=rexp(sum(u==0),b/(p+1))^(1/(p+1))
x[u==1]=rexp(sum(u==1),a)
sampl=c(sampl,x[runif(n)<(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
(a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1)))])
}
return(sampl[1:n])}
这是a = 1,b = 2,p = 3的图示: