2015-11-08 44 views
1

對不起,可能會重複提到下面提到的問題。R優化 - 從單個迭代中檢索值

我想在optim函數的不同迭代中取消優化參數的值。目的是檢查驗證數據集上的錯誤收斂。

我的問題與this question密切相關,我試圖實現其中的代碼,我應該解決我的問題。然而,i$count兩個值表明,優化的函數被調用更多的時間比在maxit參數指定:

vals <- list() 
f1 <- function(x) { 
    i <<- i+1 
    vals[[i]] <<- x 

    x1 <- x[1] 
    x2 <- x[2] 
    x1^2 + 3*x2^2 
} 

# countBFGS 
i <- 0 
optim(c(1,1), f1, method="BFGS",control = list(trace=1, maxit = 10))$count 
i 
# countCG 
i <- 0 
optim(c(1,1), f1, method="CG",control = list(trace=1, maxit = 10))$count 
i 
# countSANN 
i <- 0 
optim(c(1,1), f1, method="SANN",control = list(trace=1, maxit = 10))$count 
i 

任何建議如何捕捉即時優化的參數?

回答

4

觀察到的計數差異是由於目標函數也將被調用來計算數值導數。如果我們提供衍生品,那麼這將不會發生,並且計數和i將對應。在下面的例子中它們都是24:

vals <- NULL; i <- 0 
gr1 <- function(x) c(2, 6) * x # gradient 
optim(c(1, 1), f1, gr1, method = "BFGS", control = list(trace = 1))$count 

## initial value 4.000000 
## final value 0.000000 
## converged 
## function gradient 
##  24  9 

i 
## [1] 24 

此外,如果我們使用不使用在第一位置衍生物如內爾德米德然後計數的優化方法,我也將對應。如果使用maxit然後嘗試跟蹤f1gr1功能:試試這個:

vals <- NULL; i <- 0 
optim(c(1, 1), f1, method = "Nelder", control = list(trace = 1))$count 
i 

ADDED。 gr1將評估maxit次和最後估價f1之前,每gr1評估可用於監測f1

vals <- NULL; i <- 0 
gr1 <- function(x) c(2, 6) * x # gradient 
trace(gr1, exit = quote(print(c(returnValue(), x)))) 
trace(f1, exit = quote(print(c(i, returnValue(), x)))) 
optim(c(1, 1), f1, gr1, method = "BFGS", control = list(trace = 10, maxit = 5))$count 
untrace(f1) 
untrace(gr1) 

,並提供:

Tracing fn(par, ...) on exit 
[1] 1 4 1 1 
initial value 4.000000 
Tracing gr(par, ...) on exit 
[1] 2 6 1 1 
Tracing fn(par, ...) on exit 
[1] 2 76 -1 -5 
Tracing fn(par, ...) on exit 
[1] 3.00 0.48 0.60 -0.20 
Tracing gr(par, ...) on exit 
[1] 1.2 -1.2 0.6 -0.2 
Tracing fn(par, ...) on exit 
[1] 4.00000000 0.55976676 -0.73469388 0.08163265 
Tracing fn(par, ...) on exit 
[1] 5.0000000 0.1728560 0.3330612 -0.1436735 
Tracing gr(par, ...) on exit 
[1] 0.6661224 -0.8620408 0.3330612 -0.1436735 
Tracing fn(par, ...) on exit 
[1] 6.000000e+00 1.207714e-05 1.192941e-03 1.884501e-03 
Tracing gr(par, ...) on exit 
[1] 0.002385882 0.011307005 0.001192941 0.001884501 
Tracing fn(par, ...) on exit 
[1] 7.000000e+00 7.788526e-09 -5.338595e-05 -4.057284e-05 
Tracing gr(par, ...) on exit 
[1] -1.067719e-04 -2.434371e-04 -5.338595e-05 -4.057284e-05 
final value 0.000000 
stopped after 5 iterations 
function gradient 
     7  5 
+0

在您的例子中'i'和'$ count'是相同的,但的Optim的迭代次數是不同的(由'maxit'設置驅動,嘗試'maxit = 5')。它適用於'BFGS'和'CG'方法。在這些情況下,我無法區分哪個函數調用對應於'i'的迭代,因此我無法使用迭代中的信息。從上面的方法函數調用計數和'maxit'值似乎以某種方式符合'SANN'和'Nelder' ... – Pepacz

+0

請參閱ADDED部分。 –