我有一个非常复杂的模型,用几个R脚本编写。最后的函数
model <- LSV_funct(s,e,h,matrix1,matrix2,vector1,A1,A2,B1,B2)
参数s,e,h
是常数,matrix1,matrix2,vector1
是输入值,A1,A2,B1,B2
需要优化,与经验数据的最佳关联。因此,我需要优化这四个参数,而我只是使用四个嵌套循环。代码如下:
s = 524; e = 684; h = 40
results <- c()
A1s <- seq(1, 10, 0.5)
A2s <- seq(10, 20, 0.5)
B1s <- seq(0.01, 0.04, 0.001)
B2s <- seq(0.5, 0.9, 0.1)
for (i in 1:length(A1s)){
for (j in 1:length(A2s)){
for (y in 1:length(B1s)){
for (k in 1:length(B2s)){
A1 <- A1s[i]; A2 <- A2s[j]; B1 <- B1s[y]; B2 <- B2s[k]
matrix1 = as.matrix(read.csv("inputs1.csv",header=FALSE)) #read in matrix1
matrix2 = as.matrix(read.csv("inputs2.csv",header=FALSE)) #read in matrix2
vector1 <- c(0.3, 0.08, 0.045, 48.25, 9.32, 54, 85, 6, 15, 1250)
source(file="mypath/LSV_fun.R", chdir=T) #call the R script where the full model is written
model <- LSV_funct(s,e,h,matrix1,matrix2,vector1,A1,A2,B1,B2) #run the funtion
out_model <- (model[[1]]) #save one model output for comparing with an empirical dataset
r <- cor(out_model, empirical_dataset) #calculate correlation between modeled and observed dataset
comb <- cbind(r, A1, A2, B1, B2) #save correlation value and parameters combination
results <- rbind(results,comb)
}
}
}
}
combin <- as.data.frame(results) #save everything in a dataframe
names(combin) <- c("corr", "A1", "A2", "B1", "B2")
best <- subset(combin, combin$corr == max(combin$corr)) #and finally save the combination of parameters that give the best correlation
print(best)
问题在于该系统根本不具备时间效率。运行优化需要长达数小时的时间并保存最佳参数集。
是否有更智能的功能来执行相同的操作但效率更高?我查看了optim()
函数,但是我遇到了将它用于我的目的和模型的困难(我在优化算法方面没有多少经验......)
提前感谢任何建议!
答案 0 :(得分:0)
根据你的描述,似乎LSV_funct
占用大部分时间 - 嵌套循环本身肯定不是问题。 (通过移除最内圈的主体来仔细检查。)
有几种方法可以解决这个问题:
LSV_funct
查看第二个BatchJobs
package,第三个选项BatchExperiments
package(尤其是函数makeDesign
)。 (后一个包使用前一个包作为后端。)
我无法在您的问题中找到足够的细节来帮助您完成第一个选项。