4
我有一個同時計算梯度和輸出的函數。我想根據一個目標函數來優化它。我如何將目標和漸變作爲列表傳遞給optimx
?下面的例子說明了這個問題:R優化 - 將列表和梯度函數參數作爲列表傳遞
假設我想找到多項式的最小非負根x^4 - 3*x^2 + 2*x + 3
。其梯度爲4*x^3 - 6*x + 2
。我使用optimx
中的方法nlminb
,如下所示。
optimx(par = 100, method = "nlminb", fn = function(x) x^4 - 3*x^2 + 2*x + 3,
gr=function(x) 4*x^3 - 6*x + 2, lower = 0)
這工作得很好,我也得到了以下的輸出:
p1 value fevals gevals niter convcode kkt1 kkt2 xtimes
nlminb 1 3 27 24 23 0 TRUE TRUE 0
現在假設我定義函數fngr
,它返回客觀和梯度的列表:
fngr <- function(x) {
fn <- x^4 - 3*x^2 + 2*x + 3
gr <- 4*x^3 - 6*x + 2
return (list(fn = fn, gr = gr))
}
我試圖撥打optimx
如下:
do.call(optimx, c(list(par = 100, lower = 0, method="nlminb"), fngr))
這返回以下錯誤:
Error in optimx.check(par, optcfg$ufn, optcfg$ugr, optcfg$uhess, lower, :
Function provided is not returning a scalar number
什麼是定義fngr
正確的方式和調用optimx
時,我想通過客觀和梯度作爲一個列表?
謝謝。
我不認爲你可以真正從定義FN脫身,分別GR(即使這掩蓋就像在@ 42的答案中一樣)。通常,優化子程序將獨立於另一個函數調用每個函數,可能具有不同的參數。你不能假定每個fn的調用都可以匹配到一個gr的調用。 –
注意到,感謝您的輸入。 – user3294195