【发布时间】: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