r - 使用 R 中的 apply 函数族进行向量化

标签 r machine-learning regression vectorization apply

我正在使用线性回归模型,我想手动计算一些性能指标。我使用留一交叉验证 (LOOCV) 分割数据。

下面的 R 代码给了我想要的结果,但由于我使用 for 循环和 LOOCV,所以需要很长时间。

有没有一种方法可以快速重写我的代码,例如使用 R 中的 apply 函数系列?

数据集上传自here

wdbc <- read_excel("Folds5x2_pp.xlsx") 
wdbc[] <- lapply(wdbc, scale)

   dim(wdbc)

9568    5

   head(wdbc)

1 -0.629 -0.987  1.82  -0.00952  0.521
2  0.742  0.681  1.14  -0.975   -0.586
3 -1.95  -1.17  -0.185  1.29     2.00 
4  0.162  0.237 -0.508  0.228   -0.462
5 -1.19  -1.32  -0.678  1.60     1.14 
6  0.888  0.404 -0.173 -0.996   -0.627

fitted_value <- rep(0,nrow(wdbc))

for(i in 1:nrow(wdbc)){
test<-wdbc[i,]
training<-wdbc[-i,]
m=lad(PE ~ ., data=training, method="BR")

co.data = coef(m)
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "PE")]))
fitted_value[i] <- x %*% co.data
    }

R2<-(cor(wdbc$PE,fitted_value)^2) 
SAD<-sum(abs(wdbc$PE-fitted_value))

c(round(SAD,2) ,round(R2,2))

注1

问题中使用的数据仅用于解释,因为在我的项目中我有许多高维度的数据集。

编辑

根据@Dominic van Essen的回答,我使用了以下R代码,并使用了parallel包中的parSapply函数,但它比for循环花费的时间更多。

library(parallel)

mycluster=makeCluster(detectCores()-1) 
wdbc <- read_excel("Folds5x2_pp.xlsx") 
wdbc[] <- lapply(wdbc, scale)
clusterExport(mycluster,c("lad","wdbc")) 

fitted_value = parSapply(mycluster,seq_len(nrow(wdbc)),function(i) {
    for(i in 1:nrow(wdbc)){
    test<-wdbc[i,]
    training<-wdbc[-i,]
    m=lad(PE ~ ., data=training, method="BR")

    co.data = coef(m)
    x = cbind(1, as.matrix(test[, !(colnames(test) %in% "PE")]))
  }
    return (x %*% co.data)
})

注2

我有 8 个核心,“PE”是我的数据集中的因变量。

最佳答案

您可以使用 sapply 而不是 for... 轻松地重写循环,尽管,正如 bzki 评论的那样,仅此一项不会加速您的代码:

# sapply version:
fitted_value = sapply(seq_len(nrow(wdbc)),function(i) {
    # put all the gubbins in here
    # ...
    return (x %*% co.data)
})

但是,如果您的计算机上有多个可用内核,或者更好的是可以访问具有多个处理器的服务器,则可以使用 parSapply 轻松并行化 sapply 循环code> 来自“parallel”包,如本例所示:

# slow sapply loop (takes 12s):
data=123
answer = sapply(1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
# faster parallel version (takes 4s on my laptop with 4 cores):
library(parallel)
mycluster=makeCluster(detectCores()-1) # leave 1 core available for system 
data=123
clusterExport(mycluster,"data") # specify variable(s) that should be available to parallel function
answer = parSapply(mycluster,1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
stopCluster(mycluster)

关于r - 使用 R 中的 apply 函数族进行向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61578284/

相关文章:

python - 我的余弦相似度有什么问题? tensorflow

python - 应用 Plyfit 函数查找每个数据帧列的斜率

Rowwise sum 在 R 的 dplyr 中不起作用

r - “lpSolveAPI 用于原始测试的意外结果”逻辑回归的错误

重新加载带有编译扩展的 R 包

image-processing - 使用机器学习创建植物健康分类器

tensorflow - 如何将保存的模型从sklearn转换为tensorflow/lite

r - 根据组属性在 R 中生成新变量

r - 为什么 arm::standardize() 无法在循环中处理 lm 对象?

html - vglm 回归对象 (VGAM) 的 Latex 或 HTML 摘要输出表