R:只有长度为 1 的列被回收
R: Only length-1 columns are recycled
我正在使用 R。我正在尝试按照此页面 (https://cran.r-project.org/web/packages/ParBayesianOptimization/vignettes/functionMaximization.html) 中的示例进行优化 - 我尝试为具有“多个输入”的函数创建一个新示例。
例如:
#load necessary library
library(ParBayesianOptimization)
#define function to be optimized
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)
}
}
FUNwrapper <- function(x1,x2,x3,x4) list(
"Score"=bayesian_function(x1=x1,
x2=x2,
x3=x3,
x4=x4)
)
#specify bounds
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
#run optimization algorithm
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)... 2.71 seconds
Starting Epoch 3
1) Fitting Gaussian Process...
2) Running local optimum search...
- Convergence Not Found. Trying again with tighter parameters... 0.5 seconds
3) Running FUN 1 times in 1 thread(s)... 0.28 seconds
因此,我尝试增加迭代次数,这样算法也许能找到更好的点:
#increase the number of iterations
optObj <- bayesOpt(
FUN = bayesian_function
, bounds = bounds
, initPoints = 1000
, acq = "ei"
, iters.n = 10
, gsPoints = 25
)
但这会产生以下错误:
Running initial scoring function 1000 times in 1 thread(s)... 359 seconds
Error in rbindlist(scoreSummary) :
Column 2 of item 1 is length 6 inconsistent with column 1 which is length 100. Only length-1 columns are recycled.
有谁知道为什么会产生这个错误?是不是函数迭代次数太多了?
谢谢
我不确定你的错误是否是因为你的 R 版本,在我的例子中是 4.1.0。
我 运行 你的代码有问题。
#load necessary library
library(ParBayesianOptimization)
#define function to be optimized
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)
}
你在这里写了另一个不匹配的括号,所以我删除了它。
FUNwrapper <- function(x1,x2,x3,x4) list(
"Score"=bayesian_function(x1=x1,
x2=x2,
x3=x3,
x4=x4)
)
#specify bounds
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
#run optimization algorithm
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.92 seconds
Starting Epoch 1
1) Fitting Gaussian Process...
2) Running local optimum search... 0.97 seconds
3) Running FUN 1 times in 1 thread(s)... 0.15 seconds
Starting Epoch 2
1) Fitting Gaussian Process...
2) Running local optimum search... 0.5 seconds
3) Running FUN 1 times in 1 thread(s)... 0.13 seconds
如您所见,在我的例子中算法收敛了。你应该检查你的图书馆。让我分享一下我的环境。
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DiceKriging_1.6.0 ParBayesianOptimization_1.2.4
loaded via a namespace (and not attached):
[1] zip_2.2.0 Rcpp_1.0.7 cellranger_1.1.0 pillar_1.6.1
[5] compiler_4.1.0 ggpubr_0.4.0 lhs_1.1.1 forcats_0.5.1
[9] iterators_1.0.13 tools_4.1.0 lifecycle_1.0.0 tibble_3.1.2
[13] gtable_0.3.0 pkgconfig_2.0.3 rlang_0.4.11 openxlsx_4.2.4
[17] foreach_1.5.1 curl_4.3.2 haven_2.4.1 rio_0.5.27
[21] dplyr_1.0.7 hms_1.1.0 generics_0.1.0 vctrs_0.3.8
[25] grid_4.1.0 tidyselect_1.1.1 glue_1.4.2 data.table_1.14.0
[29] R6_2.5.0 rstatix_0.7.0 fansi_0.5.0 readxl_1.3.1
[33] foreign_0.8-81 carData_3.0-4 ggplot2_3.3.5 purrr_0.3.4
[37] tidyr_1.1.3 car_3.0-11 magrittr_2.0.1 scales_1.1.1
[41] backports_1.2.1 codetools_0.2-18 ellipsis_0.3.2 abind_1.4-5
[45] colorspace_2.0-2 ggsignif_0.6.2 utf8_1.2.1 stringi_1.6.2
[49] munsell_0.5.0 broom_0.7.8 crayon_1.4.1 dbscan_1.1-8
关于你如何知道算法是否收敛的问题:
getBestPars(optObj)
> getBestPars(optObj)
$x1
[1] 40
$x2
[1] 45
$x3
[1] 20
$x4
[1] 50
让我们 运行 这个过程稍微长一点:
optObjv1 <- addIterations(optObj,iters.n=3,verbose=0)
getBestPars(optObjv1)
$x1
[1] 40
$x2
[1] 45
$x3
[1] 20
$x4
[1] 50
即使我们增加迭代次数,全局最优值也没有改变。
看看这个参考资料:
https://github.com/AnotherSamWilson/ParBayesianOptimization
我正在使用 R。我正在尝试按照此页面 (https://cran.r-project.org/web/packages/ParBayesianOptimization/vignettes/functionMaximization.html) 中的示例进行优化 - 我尝试为具有“多个输入”的函数创建一个新示例。
例如:
#load necessary library
library(ParBayesianOptimization)
#define function to be optimized
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)
}
}
FUNwrapper <- function(x1,x2,x3,x4) list(
"Score"=bayesian_function(x1=x1,
x2=x2,
x3=x3,
x4=x4)
)
#specify bounds
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
#run optimization algorithm
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)... 2.71 seconds
Starting Epoch 3
1) Fitting Gaussian Process...
2) Running local optimum search...
- Convergence Not Found. Trying again with tighter parameters... 0.5 seconds
3) Running FUN 1 times in 1 thread(s)... 0.28 seconds
因此,我尝试增加迭代次数,这样算法也许能找到更好的点:
#increase the number of iterations
optObj <- bayesOpt(
FUN = bayesian_function
, bounds = bounds
, initPoints = 1000
, acq = "ei"
, iters.n = 10
, gsPoints = 25
)
但这会产生以下错误:
Running initial scoring function 1000 times in 1 thread(s)... 359 seconds
Error in rbindlist(scoreSummary) :
Column 2 of item 1 is length 6 inconsistent with column 1 which is length 100. Only length-1 columns are recycled.
有谁知道为什么会产生这个错误?是不是函数迭代次数太多了?
谢谢
我不确定你的错误是否是因为你的 R 版本,在我的例子中是 4.1.0。
我 运行 你的代码有问题。
#load necessary library
library(ParBayesianOptimization)
#define function to be optimized
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)
}
你在这里写了另一个不匹配的括号,所以我删除了它。
FUNwrapper <- function(x1,x2,x3,x4) list(
"Score"=bayesian_function(x1=x1,
x2=x2,
x3=x3,
x4=x4)
)
#specify bounds
bounds <- list(x1 =c(20,40), x2 = c(30,45), x3 = c(10,20), x4 = c(10,50))
#run optimization algorithm
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.92 seconds
Starting Epoch 1
1) Fitting Gaussian Process...
2) Running local optimum search... 0.97 seconds
3) Running FUN 1 times in 1 thread(s)... 0.15 seconds
Starting Epoch 2
1) Fitting Gaussian Process...
2) Running local optimum search... 0.5 seconds
3) Running FUN 1 times in 1 thread(s)... 0.13 seconds
如您所见,在我的例子中算法收敛了。你应该检查你的图书馆。让我分享一下我的环境。
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DiceKriging_1.6.0 ParBayesianOptimization_1.2.4
loaded via a namespace (and not attached):
[1] zip_2.2.0 Rcpp_1.0.7 cellranger_1.1.0 pillar_1.6.1
[5] compiler_4.1.0 ggpubr_0.4.0 lhs_1.1.1 forcats_0.5.1
[9] iterators_1.0.13 tools_4.1.0 lifecycle_1.0.0 tibble_3.1.2
[13] gtable_0.3.0 pkgconfig_2.0.3 rlang_0.4.11 openxlsx_4.2.4
[17] foreach_1.5.1 curl_4.3.2 haven_2.4.1 rio_0.5.27
[21] dplyr_1.0.7 hms_1.1.0 generics_0.1.0 vctrs_0.3.8
[25] grid_4.1.0 tidyselect_1.1.1 glue_1.4.2 data.table_1.14.0
[29] R6_2.5.0 rstatix_0.7.0 fansi_0.5.0 readxl_1.3.1
[33] foreign_0.8-81 carData_3.0-4 ggplot2_3.3.5 purrr_0.3.4
[37] tidyr_1.1.3 car_3.0-11 magrittr_2.0.1 scales_1.1.1
[41] backports_1.2.1 codetools_0.2-18 ellipsis_0.3.2 abind_1.4-5
[45] colorspace_2.0-2 ggsignif_0.6.2 utf8_1.2.1 stringi_1.6.2
[49] munsell_0.5.0 broom_0.7.8 crayon_1.4.1 dbscan_1.1-8
关于你如何知道算法是否收敛的问题:
getBestPars(optObj)
> getBestPars(optObj)
$x1
[1] 40
$x2
[1] 45
$x3
[1] 20
$x4
[1] 50
让我们 运行 这个过程稍微长一点:
optObjv1 <- addIterations(optObj,iters.n=3,verbose=0)
getBestPars(optObjv1)
$x1
[1] 40
$x2
[1] 45
$x3
[1] 20
$x4
[1] 50
即使我们增加迭代次数,全局最优值也没有改变。
看看这个参考资料: https://github.com/AnotherSamWilson/ParBayesianOptimization