首页 > 解决方案 > “从 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.

有人可以告诉我如何解决这个问题吗?谢谢

标签: ralgorithmfunctionoptimizationclosures

解决方案


根据您指定的示例,这应该有效:

#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
> 

推荐阅读