使用R优化模型中的四个参数。比使用嵌套循环更好的方法?

时间:2015-01-05 15:59:45

标签: r loops optimization nested-loops mathematical-optimization

我有一个非常复杂的模型,用几个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()函数,但是我遇到了将它用于我的目的和模型的困难(我在优化算法方面没有多少经验......)

提前感谢任何建议!

1 个答案:

答案 0 :(得分:0)

根据你的描述,似乎LSV_funct占用大部分时间 - 嵌套循环本身肯定不是问题。 (通过移除最内圈的主体来仔细检查。)

有几种方法可以解决这个问题:

  1. 改善LSV_funct
  2. 的运行时间
  3. 在多个核心/处理器/机器上分配计算
  4. 仅评估(巧妙选择的)参数子集。
  5. 查看第二个BatchJobs package,第三个选项BatchExperiments package(尤其是函数makeDesign)。 (后一个包使用前一个包作为后端。)

    我无法在您的问题中找到足够的细节来帮助您完成第一个选项。