簡單地說,我有一個函式f(x, t2),我想找到x的值,使f(x, t2)相對于t2的積分最大化。我選擇pso演算法來做優化。可執行的代碼如下
library(pso)
xl=0; xu=2000; n=1。t2l=100; t2u=2000; t1=1< -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)/span>)-log(det(D0))
}
obj<-function(x){>
dp=x[/span>1。 2]/span>。dw=c(x[3]/span>。 1-x[/span>3])
fitness_value=-integrate(Vectorize(函式(t2)logdetHinv(dp, dw。 t2)*1/(t2u-t2l))。 t2l, t2u)$value
return(ifelse(Dw[2]/span>> 0, fitness_value。 fitness_value 1e3))
}
x < - psoptim(rep(1。 3), fn = obj。 lower = c(rep(xl。 2),0. 1)。 上 = c(rep(xu。 2), 0. 9))$par
x
由于全域優化涉及到一些隨機程式,它有時會報告正確的結果
。>/span> x
[1] 2000。 0000 754.4146 0.5000
其他時候它報告錯誤
Error in integrate(Vectorize(函式(t2)logdetHinv(dp, dw。 t2) * 1/(t2u - :
非-無限的函式值
此外。 有11個警告(使用警告()來查看它們)。
>警告()。
警告資訊:
1。 在log(det(D1)) 。 產生的NaNs
2。 在log(det(D0) 。 產生的NaNs
3。 在log(det(D1)) 。 產生的NaNs
4。 在log(det(D0) 。 產生的NaNs
我假設該演算法試圖在logdetHinv中記錄一些負值,它回傳NaN,并帶有警告資訊,還不是錯誤,最后在integrate中引起錯誤。
我想避免這樣的值,也許可以用tryCatch,就像如果函式logdetHinv中有警告,它回傳一個非常小的值,但不是NaN,所以它不會在integrate中引起錯誤,而psoptim在最大化目標函式(最小化integrate(logdetHinv))時不可能選擇這種值。我不熟悉tryCatch在這種復雜情況下的作用。我應該把tryCatch放在哪里?謝謝。
此外,我想知道R中是否有一些除錯技術可以讓我知道在這種情況下是什么隨機值(D0/D1)導致的錯誤。我猜是日志中的某個負值,但它不應該,因為日志里面是一個正定矩陣的行列式。在回溯模式下,在瀏覽中,如果我輸入D0,物件'D0'將不會被發現。
uj5u.com熱心網友回復:
在這種情況下,我不會使用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(/span>detD1)-log(detD0)
}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316550.html
標籤:
下一篇:訓練資料比測驗資料有更多的列
