具有潜力warnings/errors的R全局优化问题及tryCatch的使用
R global optimization problem with potential warnings/errors and the use of tryCatch
简单地说,我有一个函数 f(x, t2)
,我想找到 x
的值,使 f(x, t2)
相对于 t2
的积分最大化。我选择 pso 算法进行优化。可执行代码如下
library(pso)
xl=0; xu=2000; n=1; t2l=100; t2u=2000; t1=1
g<-function(x, t2) t1*x/(t2+x)
h<-function(z) 1/z^n
gdot<-function(x, t2){
c(x/(t2+x),-t1*x/(t2+x)^2)
}
logdetHinv<-function(dp, dw, t2){
gmat=mapply(function(x) gdot(x,t2),dp)
D0=gmat%*%diag(dw)%*%t(gmat)
D1=gmat%*%diag(1/h(g(dp,t2)))%*%diag(dw)%*%t(gmat)
2*log(det(D1))-log(det(D0))
}
obj<-function(x){
dp=x[1:2]; dw=c(x[3],1-x[3])
fitness_value=-integrate(Vectorize(function(t2) logdetHinv(dp, dw, t2)*1/(t2u-t2l)), t2l, t2u)$value
return(ifelse(dw[2]>0, fitness_value, fitness_value+1e3))
}
x <- psoptim(rep(1,3), fn = obj, lower = c(rep(xl,2),0.1), upper = c(rep(xu,2), 0.9))$par
x
由于全局优化涉及一些随机过程,有时会报告正确的结果
> x
[1] 2000.0000 754.4146 0.5000
其他时候报错
Error in integrate(Vectorize(function(t2) logdetHinv(dp, dw, t2) * 1/(t2u - :
non-finite function value
In addition: There were 11 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: In log(det(D1)) : NaNs produced
2: In log(det(D0)) : NaNs produced
3: In log(det(D1)) : NaNs produced
4: In log(det(D0)) : NaNs produced
我想该算法尝试记录 logdetHinv
中的一些负值,其中 returns NaN
带有警告消息,但还不是错误,最终导致 [= =20=].
我想避免这样的值,也许 tryCatch
,如果函数 logdetHinv
中有警告,它 returns 一个非常小的值,但不是 NaN
,所以不会导致integrate
出错,而psoptim
在最大化objective函数(最小化-integrate(logdetHinv)
)时不太可能选择这样的值。在这种复杂的情况下,我不熟悉tryCatch
。我应该把 tryCatch
放在哪里?谢谢。
此外,我想知道 R 中是否有一些调试技术可以让我知道在这种情况下是什么随机值 (D0/D1
) 导致了错误。我猜它是对数中的某个负值,但它不应该,因为对数内部是正定矩阵的行列式。在回溯模式下,在浏览器中,如果我键入 D0
,将找不到对象 'D0'。
在这种情况下,我不会使用 tryCatch,它在测试中通常比在您的主代码中更合适。为什么不简单地测试函数中的决定因素?类似的东西应该可以工作:
logdetHinv<-function(dp, dw, t2){
gmat=mapply(function(x) gdot(x,t2),dp)
D0=gmat%*%diag(dw)%*%t(gmat)
D1=gmat%*%diag(1/h(g(dp,t2)))%*%diag(dw)%*%t(gmat)
detD1 <- max(0.01, det(D1))
detD0 <- max(0.01, det(D0))
2*log(detD1)-log(detD0)
}
简单地说,我有一个函数 f(x, t2)
,我想找到 x
的值,使 f(x, t2)
相对于 t2
的积分最大化。我选择 pso 算法进行优化。可执行代码如下
library(pso)
xl=0; xu=2000; n=1; t2l=100; t2u=2000; t1=1
g<-function(x, t2) t1*x/(t2+x)
h<-function(z) 1/z^n
gdot<-function(x, t2){
c(x/(t2+x),-t1*x/(t2+x)^2)
}
logdetHinv<-function(dp, dw, t2){
gmat=mapply(function(x) gdot(x,t2),dp)
D0=gmat%*%diag(dw)%*%t(gmat)
D1=gmat%*%diag(1/h(g(dp,t2)))%*%diag(dw)%*%t(gmat)
2*log(det(D1))-log(det(D0))
}
obj<-function(x){
dp=x[1:2]; dw=c(x[3],1-x[3])
fitness_value=-integrate(Vectorize(function(t2) logdetHinv(dp, dw, t2)*1/(t2u-t2l)), t2l, t2u)$value
return(ifelse(dw[2]>0, fitness_value, fitness_value+1e3))
}
x <- psoptim(rep(1,3), fn = obj, lower = c(rep(xl,2),0.1), upper = c(rep(xu,2), 0.9))$par
x
由于全局优化涉及一些随机过程,有时会报告正确的结果
> x
[1] 2000.0000 754.4146 0.5000
其他时候报错
Error in integrate(Vectorize(function(t2) logdetHinv(dp, dw, t2) * 1/(t2u - :
non-finite function value
In addition: There were 11 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: In log(det(D1)) : NaNs produced
2: In log(det(D0)) : NaNs produced
3: In log(det(D1)) : NaNs produced
4: In log(det(D0)) : NaNs produced
我想该算法尝试记录 logdetHinv
中的一些负值,其中 returns NaN
带有警告消息,但还不是错误,最终导致 [= =20=].
我想避免这样的值,也许 tryCatch
,如果函数 logdetHinv
中有警告,它 returns 一个非常小的值,但不是 NaN
,所以不会导致integrate
出错,而psoptim
在最大化objective函数(最小化-integrate(logdetHinv)
)时不太可能选择这样的值。在这种复杂的情况下,我不熟悉tryCatch
。我应该把 tryCatch
放在哪里?谢谢。
此外,我想知道 R 中是否有一些调试技术可以让我知道在这种情况下是什么随机值 (D0/D1
) 导致了错误。我猜它是对数中的某个负值,但它不应该,因为对数内部是正定矩阵的行列式。在回溯模式下,在浏览器中,如果我键入 D0
,将找不到对象 'D0'。
在这种情况下,我不会使用 tryCatch,它在测试中通常比在您的主代码中更合适。为什么不简单地测试函数中的决定因素?类似的东西应该可以工作:
logdetHinv<-function(dp, dw, t2){
gmat=mapply(function(x) gdot(x,t2),dp)
D0=gmat%*%diag(dw)%*%t(gmat)
D1=gmat%*%diag(1/h(g(dp,t2)))%*%diag(dw)%*%t(gmat)
detD1 <- max(0.01, det(D1))
detD0 <- max(0.01, det(D0))
2*log(detD1)-log(detD0)
}