0

这是我第一次使用一般的并行处理。问题主要是关于我糟糕的语法。

我需要一些帮助来捕获大量 cv.glmnet 迭代的输出,因为我相信我已经将 cv_loop_run 构建为非常低效。这与 10k 的 lambda 数量一起导致了一个巨大的矩阵,它占用了我所有的内存并导致崩溃。本质上,我需要的是每次运行的最小值1se lambda(其中 1000 个,而不是全部 10,000 个)。因此,我不会为 cv_loop_run 捕获一个 1kx10k 的列表,而是得到一个 1k 长的列表。

  registerDoParallel(cl=8,cores=4)  
  cv_loop_run<- rbind( foreach(r = 1:1000,
                              .packages="glmnet",
                              .combine=rbind,
                              .inorder =F) %dopar% {

                        cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
                                           nlambda = 10000,
                                           alpha = 1, #FOR LASSO
                                           grouped = FALSE,
                                           parallel= TRUE
                                          )

                                                   }
                    )
  l_min<- as.matrix(unlist(as.matrix(cv_loop_run[,9 ,drop=FALSE] ))) # matrix  #9  is lamda.min

  l_1se<- as.matrix(unlist(as.matrix(cv_loop_run[,10 ,drop=FALSE] ))) # matrix  #10  is lamda.1se
4

1 回答 1

0

好的,所以我自己找到了。我所要做的就是限制每个 cv.glmnet 运行的输出。这样,每次运行只会获取最小值和 1se lambda。这意味着:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
                                       nlambda = 10000,
                                       alpha = 1, #FOR LASSO
                                       grouped = FALSE,
                                       parallel= TRUE
                                      )

变成这样:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld,
                                       nlambda = 10000,
                                       alpha = 1, #FOR LASSO
                                       grouped = FALSE,
                                       parallel= TRUE
                                      )[9:10]
于 2016-09-07T09:08:14.630 回答