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