首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化迭代函数进行大数据分析?

如何优化迭代函数进行大数据分析?
EN

Stack Overflow用户
提问于 2014-11-19 08:48:24
回答 1查看 102关注 0票数 0

我有一个优化模型的问题。我的函数在迭代过程中递增变量(Dem)的值,以达到"WHILE“中设置的条件。

我必须使用"FOR's“和一些"IF's",我知道这使得R环境中的处理非常慢,但我必须在R中这样做。变量P是10958个of的长度。变量A和C的长度为65511个obs。

使用system.time (myfunction),只使用变量Area 1和C1中的一个元素,我的计算机需要2.5秒来完成这个过程。但对于Area和C的所有元素,将需要45个小时。

我的教授说它太慢了,但我认为数据量是正常的,有什么方法可以优化它吗?选项是否应该优化函数(PSO、DEoptim等)而不是使用WHILE?

代码语言:javascript
复制
myfunction = function(P,Area,C,Cap,Inc){      
  Vin<- Cap
  Q<-NA
  Ov<-NA
  Def<-NA
  Vf<-NA
  Vp<-NA
  Dem<-0
  Dem_100<-NA
  Fail<-0

  for (i in 1:length(Area)){        
    while(Fail==0){          
      Dem<-Dem+Inc          
      for (j in 1:length(P)){             
        #-----------------------------------------------------------------------#    
        ####################### Calculate Q #####################################
        #-----------------------------------------------------------------------#           
        if (P[j]==0){
          Q<-0
        }else{
          Q<-P[j]*Area[i]*C[i]
        }

        #-----------------------------------------------------------------------  
        ################################ Calculate Vp ##########################
        #-----------------------------------------------------------------------            
        Vp<- (Vin + Q) - Dem         
        if(Vp<0){
          Fail<-1
          break #stop For j and continue the while
        }

        #----------------------------------------------------------------------  
        ###################################### Calculate OV ###################
        #----------------------------------------------------------------------
        if (Vp>Cap){              
          Ov<-Vp-Cap          
        }else{ 
          Ov<-0
        }

        #---------------------------------------------------------------------
        ######################################## Calculate Def ###############
        #---------------------------------------------------------------------   
        if (Vp<0){ 
          Def<-0-Vp
        }else{
          Def<-0
        }

        #---------------------------------------------------------------------#    
        ################################## Calculate Vf ###########
        #---------------------------------------------------------------------#            
        if (Vp>Cap){
          Vf<-Cap
        }else{
          if (Vp<0) {
            Vf<-0
          }else{
            Vf<-Vp
          }
        }

        #-----------------------------------------------------------------------#    
        ################################## Update Vin ###########
        #-----------------------------------------------------------------------#            
        Vin<-Vf           
      }
      Vin<- Cap # Reset the var Vin for new j
    }

    Dem_100[i]<-Dem-Inc
    Def<-NA
    Dem<-0
    Vin<- Cap
    Fail<-0
 }
  return(list(DemGar100=Dem_100))
}

时间过程测试

代码语言:javascript
复制
P<-abs(rnorm(10958))
system.time(myfunction(P = P,Area = 100,C = 0.8,Cap = 10000,Inc = 1))
   user  system elapsed 
   2.45    0.00    2.50
EN

回答 1

Stack Overflow用户

发布于 2014-11-19 19:21:12

没有足够的代表来评论,但既然不是一个完整的答案,它应该放在那里。

你有没有想过用if替换掉一些if?这应该会加快速度,例如,你可以用下面这样的东西替换整个j-loop:

(i in 1:长度(面积)){

while(Fail==0){

Dem<-Dem+Inc

Q <-如果##note (P==0,0,P*Areai*Ci) q是一个长度为(P)的向量...

此外,我认为Def似乎从未计算过(当失败时,Vf总是Vp ),因为如果失败,你会跳出j循环,甚至可能跳出while (你将Vp<0设置为1,但我不知道R何时检查条件,在循环结束时?还是在开始时)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27007029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档