【问题标题】:non-finite value supplied by optim using Pareto optimizationoptim 使用 Pareto 优化提供的非有限值
【发布时间】:2021-09-24 13:29:24
【问题描述】:

我正在尝试按照GPareto R package 的说明优化我定义的任意函数。

这是函数(7 个输入,4 个输出):

library(gpareto)
library(dplyr)

# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,5)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)

funct_set <- function (x) {
    x1 <- x[1]; x2 <- x[2]; x3 <- x[3] ; x4 <- x[4]; x5 <- x[5]; x6 <- x[6]; x[7] <- x[7]
    f <- numeric(4)
   
    #bin data according to random criteria
    train_data <- train_data %>%
        mutate(cat = ifelse(a1 <= x1 & b1 <= x3, "a",
                            ifelse(a1 <= x2 & b1 <= x4, "b", "c")))
    
    train_data$cat = as.factor(train_data$cat)
    
    #new splits
    a_table = train_data %>%
        filter(cat == "a") %>%
        select(a1, b1, c1, cat)
    
    b_table = train_data %>%
        filter(cat == "b") %>%
        select(a1, b1, c1, cat)
    
    c_table = train_data %>%
        filter(cat == "c") %>%
        select(a1, b1, c1, cat)
   
    #calculate  quantile ("quant") for each bin
    
    table_a = data.frame(a_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[5],1,0 )))
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[6],1,0 )))
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[7],1,0 )))
    f[1] = mean(table_a$quant)
    f[2] = mean(table_b$quant)
    f[3] = mean(table_c$quant)
    
    #group all tables
    final_table = rbind(table_a, table_b, table_c)
    # calculate the total mean 
    f[4] = mean(final_table$quant)
   
    return (f)
}

然后我设置优化的规范(例如上限和下限、迭代次数):

lower=c(80,80,80,80, 100,200,300)
upper=c(120,120,120,120,200,300,400)
budget <- 25

接下来,我运行优化算法:

omEGO <- easyGParetoptim(fn = funct_set, budget = budget, lower = lower, upper = upper)

但这会产生错误:

优化错误(par = parinit, fn = fn, gr = gr, method = "L-BFGS-B", lower = lower, : optim 提供的非有限值

我尝试查看 Stack Overflow 上遇到类似错误的其他帖子:"non-finite value supplied by optim" error when using betareg

但我不确定如何应用这些帖子中的逻辑来解决我的问题。

【问题讨论】:

  • 在你的函数中加入一些print()cat()语句,打印出参数的当前值和返回值;这样您就可以确定问题发生在哪里
  • @Ben Bolker:感谢您的回复!我在结束函数(func_set)中添加了“print()”并得到以下错误: print.default()中的错误:缺少参数“x”,没有默认值
  • 我在函数(func set)的末尾添加了“cat()”并得到以下错误: optim(par = parinit,fn = fn,gr = gr,method =“ L-BFGS-B", lower = lower, : optim 提供的非有限值
  • 这是你的意思吗?感谢您的所有帮助!
  • 您需要print()cat() something,即您需要指定一些参数(例如您的参数值和目标函数值)

标签: r algorithm function optimization


【解决方案1】:

部分解决方案,至少可以帮助您开始调试。

  1. 我插入了以下几行:
print(x)
print(f)

return(f) 语句之前。

它说明了您的子函数之一返回 NaN 的许多地方,例如在第一行:

      x.1       x.2       x.3       x.4       x.5       x.6       x.7 
 91.55028 117.93290  87.38835  99.87770 100.53399 260.07302 310.29938 
[1]       NaN 0.7160494 0.7023346 0.7090000

(第一行表示参数,第二行表示子函数的值)。

  1. 然后我跑了
debug(funct_set)
x1 <- c(91.55028,117.93290,87.38835,99.87770,100.53399,260.07302,310.29938)
funct_set(x1)

即,设置传递给函数的初始值并单步执行代码以查看发生了什么(NaN 的来源)。

  1. 在分箱步骤之后以交互方式运行 table(train_data$cat),我们得到
  b   c 
486 514 

也就是说,您的训练数据集中没有满足条件的值a1 &lt;= x1 &amp; b1 &lt;= x3

因此,派生表a_table 为空(零行);派生自它的table_a也是空的; table_a$quant 是长度为零的向量;并且mean(table_a$quant)NaN(零长度向量的平均值未定义,因为sum(x)/length(x) 是0/0)。

如果空箱是一个合理的结果,那么您需要决定应该返回什么目标函数值(它可以像if (nrow(table_a)==0) 0 else mean(table_a$quant) 这样简单,如果零是一个合理的返回值)。否则,您需要弄清楚如何约束您的参数,以免发生这种情况。

【讨论】:

    猜你喜欢
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多