r - “从 FUN 返回的分数不是数字,不能将‘闭包’类型强制转换为‘双’类型的向量”
问题描述
我正在按照本教程 ( https://cran.r-project.org/web/packages/ParBayesianOptimization/vignettes/functionMaximization.html ) 中关于如何使用 R 编程语言优化函数的说明进行操作。
我想修改本教程中的示例以包含一个稍微复杂的示例。
我定义了以下功能:
#load necessary library
library(ParBayesianOptimization)
bayesian_function <- function(x1, x2, x3, x4) {
var_1 <- sin(x1 + x2)
var_2 <- cos(x1 - x2)
var_3 <- x1 + x4
var_4 <- x3 + x4 -7
goal = sum(var_1 + var_2 + var_3 + var_4)
return(goal)
}
FUN <- function(x1, x2, x3, x4) list(Score = bayesian_function)
我指定了函数变量可以采用的范围:
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
然后我运行优化算法:
optObj <- bayesOpt(
FUN = FUN
, bounds = bounds
, initPoints = 10
, acq = "ei"
, iters.n = 2
, gsPoints = 25
)
但这会导致以下错误:
Running initial scoring function 10 times in 1 thread(s)... 2.06 seconds
x1 x2 x3 x4 errorMessage
1: 29.71786 30.04940 15.97740 44.48221 Score returned from FUN was not numeric.
2: 32.82714 32.83628 10.38391 40.60989 Score returned from FUN was not numeric.
etc
Error in bayesOpt(FUN = FUN, bounds = bounds, initPoints = 10, acq = "ei", :
Errors encountered in initialization are listed above.
看到错误表明“从函数返回的分数不是数字”,我决定手动将其转换为“数字类型”:
bayesian_function <- function(x1, x2, x3, x4) {
var_1 <- sin(x1 + x2)
var_2 <- cos(x1 - x2)
var_3 <- x1 + x4
var_4 <- x3 + x4 -7
goal = sum(var_1 + var_2 + var_3 + var_4)
return(goal)
}
FUN <- function(x1, x2, x3, x4) list(as.numeric(Score = bayesian_function))
不幸的是,这给出了一个新错误:
Running initial scoring function 10 times in 1 thread(s)... 2.09 seconds
x1 x2 x3 x4 errorMessage
1: 37.78915 37.13628 16.12003 29.24897 cannot coerce type 'closure' to vector of type 'double'
2: 32.58058 32.99083 11.03643 13.00817 cannot coerce type 'closure' to vector of type 'double'
etc
Error in bayesOpt(FUN = FUN, bounds = bounds, initPoints = 10, acq = "ei", :
Errors encountered in initialization are listed above.
有人可以告诉我如何解决这个问题吗?谢谢
解决方案
根据您指定的示例,这应该有效:
#load necessary library
library(ParBayesianOptimization)
bayesian_function <- function(x1, x2, x3, x4) {
var_1 <- sin(x1 + x2)
var_2 <- cos(x1 - x2)
var_3 <- x1 + x4
var_4 <- x3 + x4 -7
goal = sum(var_1 + var_2 + var_3 + var_4)
return(goal)
}
}
#test
bayesian_function(1,2,3,4)
# [1] 5.681422
FUNwrapper <- function(x1,x2,x3,x4) list(
"Score"=bayesian_function(x1=x1,
x2=x2,
x3=x3,
x4=x4)
)
FUNwrapper(1,2,3,4)
#$Score
#[1] 5.681422
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
optObj <- bayesOpt(
FUN = FUNwrapper
, bounds = bounds
, initPoints = 10
, acq = "ei"
, iters.n = 2
, gsPoints = 25
)
输出:
Running initial scoring function 10 times in 1 thread(s)... 0.83 seconds
Starting Epoch 1
1) Fitting Gaussian Process...
2) Running local optimum search... 0.34 seconds
3) Running FUN 1 times in 1 thread(s)... 0.09 seconds
Starting Epoch 2
1) Fitting Gaussian Process...
2) Running local optimum search... 0.19 seconds
3) Running FUN 1 times in 1 thread(s)... 0.09 seconds
>
推荐阅读
- git - 错误:RPC 失败;curl 55 发送失败:连接被中止
- spectrum - 如果您在 Multism 中没有频谱分析仪怎么办?
- python - 为什么我不能导入 PyTube?
- javascript - 为什么调用一个`setState`函数会更新一个完全独立的状态值?
- python - 在循环中请求新代理导致代理错误并崩溃
- python - 蟒蛇 | JSONPath-ng:过滤器和值提取问题
- wordpress - ACF 自定义字段 WP GraphQL 突然开始在 Gatsby 中返回 null,即使它曾经可以工作
- javascript - 在单个空格上拆分字符串并用单个空格替换三个空格
- flutter - Flutter:如何在一个按钮上添加两条文本行?
- android - Espresso 测试在解组时导致“ClassNotFoundException”(在基本应用程序上重新生成)