在更大的优化任务中,我陷入了需要在optim
中输入列表的问题。但是,当列表中有一个向量时,我得到了错误
(list)对象不能被强制键入“ double”
下面有一个可重复的示例,错误源在butter
行中。将其分成标量可以使代码正常工作,但是我真正想要的是像init_param
这样的列表(其中butter
是向量)。
fun = function(param_list){
x2 = param_list[["x2"]]
bread = param_list[["bread"]]
x3 = param_list[["x3"]]
butter = param_list[["butter"]]
sum(
(bread - 3)^2, (x2-4)^2, (x3-125)^2, (butter[1])^2, (butter[2])^2
)
}
init_param = list(x3 = -1, bread = 50, x2 = 120, butter = c(1,2))
optim(par = init_param, fn = fun)
答案 0 :(得分:1)
par
的参数必须是标量,因此您的butter
会丢掉东西。
一种补救方法是将向量分解为标量。 (我会保留您最终的sum
公式,尽管此方法可以轻松地以不同方式更改事物以获得相同的结果。)
fun = function(param_list){
x2 = param_list[["x2"]]
bread = param_list[["bread"]]
x3 = param_list[["x3"]]
butter = c(param_list[["butter1"]], param_list[["butter2"]])
sum(
(bread - 3)^2, (x2-4)^2, (x3-125)^2, (butter[1])^2, (butter[2])^2
)
}
init_param = list(x3 = -1, bread = 50, x2 = 120, butter1 = 1, butter2 = 2)
optim(par = init_param, fn = fun)
# $par
# x3 bread x2 butter1 butter2
# 124.995189738 2.998084514 3.997427390 0.004101379 -0.005390156
# $value
# [1] 7.930112e-05
# $counts
# function gradient
# 262 NA
# $convergence
# [1] 0
# $message
# NULL
答案 1 :(得分:0)
optim
函数要求输入必须是简单的向量。您可以使用unlist
来重组代码,以根据所拥有的内容显式创建矢量,然后调整功能和周围的代码。
init_param = list(x3 = -1, bread = 50, x2 = 120, butter = c(1,2))
param_vector <- unlist(init_param)
param_vector
#> x3 bread x2 butter1 butter2
#> -1 50 120 1 2