我有一个计算量很大的函数(运行一次需要大约10分钟),这个函数有4个参数。
我将函数定义如下
function <- function(parameters){...calculate value...
return(value)
}
肯定是非线性的,我定义的这4个参数必须是整数值。我希望在从c(3, 100, 20000, 80000)
到c(10, 150, 80000, 120000)
我意识到,对于一个计算量很大且范围太大的函数,这需要很长时间进行分析。
我正在寻找一种有效的方法。 rgenoud
似乎适用于整数值,但运行后,我无法确定它是否实际运行。它在Minimization problem
行停止。
是否有其他此类优化算法(最小化或最大化)非常有效,并且无论是否正在运行都会给我一些反馈?
很抱歉,我无法提供可重复的示例,因为我无法提供数据集(100 gb),这更像是一个理论问题。
编辑:
如果这有帮助,我一直在研究的一些算法包括遗传算法,群体粒子优化,模拟退火,马尔可夫链蒙特卡罗。我对其他算法持开放态度,因为我只是在寻找最有效的方法来优化这些离散变量。
编辑2: 简化版功能:
control1 <- sample(1:75, 3947398, replace=TRUE)
control2 <- sample(1:75, 28793, replace=TRUE)
control3 <- sample(1:100, 392733, replace=TRUE)
control4 <- sample(1:75, 858383, replace=TRUE)
patient1 <- sample(1:100, 28048, replace=TRUE)
patient2 <- sample(1:50, 80400, replace=TRUE)
patient3 <- sample(1:100, 48239, replace=TRUE)
control <- list(control1, control2, control3, control4)
patient <- list(patient1, patient2, patient3)
function <- function(parameter){
s <- parameter[1]
control_s <- list()
patient_s <- list()
for (i in 1:length(control))
control_s[[i]] <- sample(control[[i]], s)
for (i in 1:length(patient))
patient_s[[i]] <- sample(patient[[i]], s)
controlfreq <- list()
for (i in 1:length(control_s)){
controlfreq[[i]] <-
as.data.frame(prop.table(table(factor(
control_s[[i]], levels = 1:100
))))[,2]}
patientfreq <- list()
for (i in 1:length(patient_s)){
patientfreq[[i]] <-
as.data.frame(prop.table(table(factor(
patient_s[[i]], levels = 1:100
))))[,2]}
controlfreq <- t(as.data.frame(controlfreq))
controltrainingset <- transform(controlfreq, status = "control")
patientfreq <- t(as.data.frame(patientfreq))
patienttrainingset <- transform(patientfreq, status = "patient")
dataset <- rbind(controltrainingset, patienttrainingset)
library(caret)
fitControl <-trainControl(method = "LOOCV", classProbs = T, savePredictions = T)
model <- train(status ~ ., data = dataset, method = "rf", trControl = fitControl)
selectedIndices <- model$pred$mtry == 2
confusionmatrix <- table(model$pred$obs[selectedIndices], model$pred$pred[selectedIndices])
metric= ((confusionmatrix[1,1]/length(control))+(confusionmatrix[2,2]/length(patient)))/2
return(-metric)}
# -metric if minimizing, metric if maximizing