【发布时间】:2021-10-21 19:42:24
【问题描述】:
我正在尝试优化一个耗时太长的 for 循环。我确信它可以优化,但由于我对 R 还很陌生,我不知道该怎么做。
我有两个矩阵,tarU_x 和 src_x。对于tarU_x 中的每一行,我想在src_x 中找到最接近的行并分配相同的标签(我在src_y 中有src_x 的标签,tarU_x 的估计标签将在@ 987654329@)。
我使用的是经典的嵌套 for 循环,效率不高,所以我想利用 R 提供的可能性。代码如下:
# Estimate tarU_y
tarU_y <- vector()
for (i in 1:nrow(tarU_x)) {
tarU_vector <- tarU_x[i,]
lowest_dist <- Inf
lowest_dist_class <- -1
for (j in 1:nrow(src_x)) {
distance <- dist(rbind(tarU_vector, src_x[j,]))
if (distance < lowest_dist) {
lowest_dist <- distance
lowest_dist_class <- src_y[j]
}
}
tarU_y[i] <- lowest_dist_class
}
编辑
按照 s__ 的建议,我尝试使用 apply,并让它工作,最终得到以下代码:
distances <- apply(src_x, 1, function (y) apply(tarU_x, 1, function(x) dist(rbind(x,y))))
tarU_y <- apply(distances, 1, function(x) src_y[which.min(x)])
但它似乎有点慢,我猜底层代码非常相似。例如,使用 for 循环的测试需要 14 秒,而使用 apply 需要 16 秒。
有关更多信息,我使用的数据是此处提供的数据:https://archive.ics.uci.edu/ml/datasets/Gas+Sensor+Array+Drift+Dataset+at+Different+Concentrations,它分为 10 个不同批次,每个样本有 128 个特征。
【问题讨论】:
-
请提供一个可重复的小输入数据示例。
-
试试
nabor::knn()。
标签: r performance for-loop vectorization