【发布时间】:2021-08-06 23:57:08
【问题描述】:
我在 R 中编写了以下代码,该代码使用“mlrMBO”库来优化(我定义的多输入、多输出函数):
#load libraries : https://cran.r-project.org/web/packages/mlrMBO/index.html
library(dplyr)
library(mlrMBO)
#create data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,9)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)
接下来,我设置了优化程序来优化这个函数(该函数有4个输入“x1,x2,x3,x4”并返回4个输出“f1,f2,f3,f4”:
#references:
https://cran.r-project.org/web/packages/smoof/index.html
https://cran.r-project.org/web/packages/ParamHelpers/index.html
#optimization
obj.fun = makeMultiObjectiveFunction(
name = "My function",
fn = function(x1,x2,x3,x4) {
#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 > 150,1,0 )))
table_b = data.frame(b_table%>% group_by(cat) %>%
mutate(quant = ifelse(c1 > 300,1,0 )))
table_c = data.frame(c_table%>% group_by(cat) %>%
mutate(quant = ifelse(c1 > 400,1,0 )))
f1 = mean(table_a$quant)
f2 = mean(table_b$quant)
f3 = mean(table_c$quant)
#group all tables
final_table = rbind(table_a, table_b, table_c)
# calculate the total mean : this is what needs to be optimized
f4 = mean(final_table$quant)
return (c(f1,f2,f3,f4))
},
n.objectives = 4L,
# define parameter acceptable ranges
par.set = makeParamSet(
makeNumericParam("x1", lower = 80, upper = 95),
makeNumericParam("x2", lower = 100, upper = 120),
makeNumericParam("x3", lower = 80, upper = 95),
makeNumericParam("x4", lower = 100, upper = 120)
forbidden = expression(x1 > x2 | x3 > x4) #define constraints
),
minimize = rep(TRUE,4)
has.simple.signature = FALSE #added
)
#set controls
ctrl = makeMBOControl()
ctrl = setMBOControlTermination(ctrl, iters = 20L)
ctrl = setMBOControlInfill(ctrl, crit = makeMBOInfillCritEI())
# opt.restarts = 1L, opt.focussearch.points = 3L, opt.focussearch.maxit = 1L)
#design = generateDesign(20L, getParamSet(obj.fun), fun = lhs::maximinLHS)
lrn = makeMBOLearner(ctrl, obj.fun)
最后,我运行了优化:
#run results
res = mbo(obj.fun, design = NULL, learner = lrn, control = ctrl, show.info = TRUE)
以上代码运行成功:
#view results
head(res)
res
Recommended parameters:
x[1]=82; x[2]=95; x[3]=80; x[4]=95
Objective: y = 0.596
Optimization path
16 + 20 entries in total, displaying last 10 (or less):
x.1. x.2. x.3. x.4. y dob eol error.message exec.time ei error.model train.time prop.type propose.time se mean
27 80.00952 95.01454 87.04891 95.00106 0.596 11 NA <NA> 0.01 -2.003089e-04 <NA> 0.09 infill_ei 0.28 0.0002983176 0.5958623
28 86.88470 95.02414 80.01132 95.00033 0.596 12 NA <NA> 0.01 -4.172457e-04 <NA> 0.10 infill_ei 0.28 0.0007558354 0.5957914
29 80.28991 95.00087 84.20295 95.00028 0.596 13 NA <NA> 0.02 -1.139749e-04 <NA> 0.08 infill_ei 0.29 0.0004338408 0.5961348
问题:但我预计会有 4 个“Y”列,例如“y.1., y.2., y.3., y.4.”(对应于函数“fn”中的“f1, f2, f3, f4”) - 因为有 4 个“输出”(即“目标”)进行优化。而是只返回一列。
有人知道为什么会这样吗?为什么只返回一个“Y”列而不是四个?
谢谢
【问题讨论】:
标签: r algorithm optimization bayesian