R

时间:2017-12-10 01:03:28

标签: r

我有一个计算量很大的函数(运行一次需要大约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

0 个答案:

没有答案
相关问题