有没有人对如何提高以下代码示例的效率有什么想法或建议?
首先,我通过一个简单的示例来定义问题,在这篇文章的底部有一个完整的 MWE(实现)。
首先,考虑以下“随机”测试向量(通常长度 >25000):
A <- c(1.23,5.44,6.3,8.45,NaN,3.663,2.63,1.32,6.623,234.6,252.36)
A
被分成一个“种类”的训练和测试集,都带有滚动窗口。在这个 MWE 中,考虑了长度为的训练集开始和长度4
为的测试集2
(通常长度>200)。因此,最初,以下值是训练集和测试集的一部分:
train_1 <- A[1:4]
test_1 <- A[5:6]
接下来,我要减去test_1
从train_1
每个可能的连续位置train_1
(因此是第一个滚动窗口)中减去,生成run_1_sub
矩阵。
run_1_sub <- matrix(NaN,3,2)
run_1_sub[1,] <- train_1[1:2] - test_1
run_1_sub[2,] <- train_1[2:3] - test_1
run_1_sub[3,] <- train_1[3:4] - test_1
之后,我想在每一行找到run_1_sub
的总和除以每一行中的条目数不是NaN
.
run_1_sum <-
sapply(1:3, function(x) {
sum(run_1_sub[x,], na.rm = T) / sum(!is.na(run_1_sub[x,]))
})
在下一步中,“种类”的训练和测试集通过将它们的顺序增加A
一来更新(因此是第二个滚动窗口):
train_2 <- A[2:5]
test_2 <- A[6:7]
如前所述,test_2
在每个可能的位置减去train_2
和run_2_sub
并run_2_sum
计算。这个过程一直持续到测试集代表 A 的最后两个值,最后我以 6 个run_sum
矩阵结束(在这个 MWE 中)。但是,我的实施非常缓慢,我想知道是否有人可以帮助我提高效率?
这是我的实现:
# Initialization
library(zoo)
#rm(list = ls())
A <- c(1.23, 5.44, 6.3, 8.45, NaN, 3.663, 2.63, 1.32, 6.623, 234.6, 252.36) # test vector
train.length <- 4
test.length <- 2
run.length <- length(A) - train.length - test.length + 1
# Form test sets
test.sets <- sapply(1:run.length, function(x) {
A[(train.length + x):(train.length + test.length + x - 1)]
})
# Generate run_sub_matrices
run_matrix <- lapply(1:run.length, function(x) {
rollapply(A[x:(train.length + x - 1)], width = test.length, by = 1,
function(y) {
y - test.sets[, x]
})
})
# Genereate run_sum_matrices
run_sum <- sapply(1:length(run_matrix), function(x) {
rowSums(run_matrix[[x]], na.rm = T) / apply(run_matrix[[x]], 1, function(y) {
sum(!is.na(y))})
})
自然,以下初始化设置会减慢run_sum
和run_sub
显着降低:
A <- runif(25000)*400
train.length <- 400
test.length <- 200
这里,生成的经过时间run_sub
分别为run_sum
120.04 秒和 28.69 秒。
关于如何提高和改进速度和代码的任何建议?