Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R optim-从单个迭代中检索值_R_Optimization - Fatal编程技术网

R optim-从单个迭代中检索值

R optim-从单个迭代中检索值,r,optimization,R,Optimization,我想在optim函数的不同迭代中检索优化参数的值。目的是检查验证数据集上错误的收敛性 我的问题与我的问题密切相关,我试图实现其中的代码,以解决我的问题。但是,i和$count的两个值都表明,调用优化函数的次数远远多于maxit参数中指定的次数: vals <- list() f1 <- function(x) { i <<- i+1 vals[[i]] <<- x x1 <- x[1] x2 <- x[2] x1^2 +

我想在
optim
函数的不同迭代中检索优化参数的值。目的是检查验证数据集上错误的收敛性

我的问题与我的问题密切相关,我试图实现其中的代码,以解决我的问题。但是,
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

vals观察到的计数差异是由于也将调用目标函数来计算数值导数。如果我们提供一个导数,那么这不会发生,计数和
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
给予:

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 

观察到的计数差异是由于也将调用目标函数来计算数值导数。如果我们提供一个导数,那么这不会发生,计数和
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
给予:

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 

在您的示例中,
i
$count
是相同的,但optim的迭代次数不同(由
maxit
设置驱动,请尝试
maxit=5
)。它同时适用于
BFGS
CG
方法。在这些情况下,我无法区分哪个函数调用对应于
I
的迭代,因此我无法使用迭代中的信息。从上述方法来看,函数调用计数和
maxit
值似乎与
SANN
Nelder
有某种对应关系……在您的示例中,
i
$count
是相同的,但optim的迭代次数不同(由
maxit
设置驱动,尝试
maxit=5
). 它同时适用于
BFGS
CG
方法。在这些情况下,我无法区分哪个函数调用对应于
I
的迭代,因此我无法使用迭代中的信息。从上述方法来看,函数调用计数和
maxit
值似乎与
SANN
Nelder
相对应。。。