【发布时间】:2021-10-09 04:26:42
【问题描述】:
我正在使用 R 编程语言。我定义了以下函数,并尝试在此函数上执行“随机搜索”算法。
首先,我加载了库:
#load library : https://cran.r-project.org/web/packages/randomsearch/index.html
library(randomsearch)
然后,我定义了函数:
# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,10)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)
#define function (4 inputs x[1], x[2], x[3], x[4] and 4 outputs f1, f2, f3, f4)
fn <- function(i) {
x1 <- x[i,1]; x2 <- x[i,2]; x3 <- x[i,3] ; x4 <- x[i,4]
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 > 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)
#add some constraints
if((x3 - x1) < 0. | (x4 - x2) < 0.) {
f[1] <- NaN
f[2] <- NaN
f[3] <- NaN
f[4] <- NaN
}
return (f)
}
最后,我尝试在这个函数上运行“随机搜索”算法:
#run algorithm
res = randomsearch(fn, lower = c(80, 80, 80, 80), upper = c(100,120,100,120), minimize = c(TRUE, TRUE, TRUE, TRUE), max.evals = 30)
rs = summary(res)
但这导致了以下错误:
fun(x, ...) 中的错误:未使用的参数 (x)
有谁知道为什么会产生这个错误?是否与我定义函数“fn”的方式有关?
谢谢
【问题讨论】:
-
函数的一个直接问题是不知道
x是什么,因此不知道x[i,j]是什么。x没有作为输入提供,但也没有在函数中创建,所以你的函数将在第一行失败。 -
@Sam Rogers:谢谢您的回复!我已经编写了同一函数的不同版本,希望其中一个定义可以工作。如果您愿意,我可以向您展示我定义此函数的其他一些方法吗?
-
除此之外,
randomsearch()的运行方式将使调试函数的问题变得困难。我建议先确保您的函数使用来自randomsearch()的预期输入,然后再在randomsearch()中使用它。 -
是的,如果您愿意,欢迎您添加更多函数示例,但我怀疑它们会遇到同样的问题。我将添加一个更详细的答案,可能会对您有所帮助,并随时发布后续问题。
标签: r function search optimization