我正在编写一个代码,它将计算一个包含多个参数的统计模型,我希望在此过程中更改该模型。然后,根据模型的性能,选择最优的模型。
我写了这么一堆伪代码,说明了这个问题:
## vectors with values of parameters
const1 <- c(300, 500)
const2 <- c(1, 2, 3, 4, 5)
const3 <- c(30, 50, 70, 90, 110, 130)
## loop counter
i = 1
for (j in 1:length(const1)){
for (k in 1:length(const2)){
for (l in 1:length(const3)){
## i-th model
model <- stat.model(x = train,
y = target,
param1 = const1,
param2 = const2,
param3 = const3)
## ... outputing model results to a data table
## printing the number of iteration
cat("iteration =", i)
i <- i+1
## calling garbage collector to assure free space in RAM
gc()
}
}
}正如您所看到的,我使用嵌套的"for“循环,这可能不是R中最有效的编程方法,有什么方法可以缩短处理时间(并可能节省代码的可读性)吗?
发布于 2016-03-14 16:00:01
for循环在R中的速度。
在R中,使用嵌套for-loops的主要问题是可读性(可能还有内存分配)。因此,如果预先知道输出的长度,可以使用vector()创建这样长的存储对象,或者直接调用lapply或vapply。for-loop本身的速度在R中不是一个严重的问题。
可读性
对于您的示例,您可以通过在三个向量上调用expand.grid来创建您想要预先使用的所有可能的组合,为此您使用了三个不同的嵌套for-loops,如下所示:
combis <- expand.grid(const1 = const1,
const2 = const2,
const3 = const3)
combis <- combis[order(combis$const1, combis$const2, combis$const3), ]
lapply(seq_len(nrow(combis)), FUN = function(i) {
model <- stat.model(x = train,
y = target,
param1 = combis[i, "const1"],
param2 = combis[i, "const2"],
param3 = combis[i, "const3"])
model
})并行化
如果您有多个核可供使用,则可以通过使用来自lapply包的mclapply轻松地将任何平行“循环”转换为并行版本。然后,您可以通过mc.cores参数指定核心的数量。这允许您用很少的额外工作来并行您的循环。
发布于 2016-03-14 15:59:16
您可以使用lapply语句向向量表示您的伪代码。
model <- function(x,y,z){x+y+z}
lapply(const1,function(x){
lapply(const2,function(y){
lapply(const3,function(z){model(x,y,z)})})})https://stackoverflow.com/questions/35991790
复制相似问题