【发布时间】:2014-03-11 16:15:24
【问题描述】:
我正在迭代地使用 rdist 来计算大型数据集的最近邻。目前我有一个相当小的矩阵,包含 634,000 个向量,有 6 列。
如前所述,我使用 rdist 来计算每个向量到每个其他向量的距离,每个距离计算都是一个步骤。此外,我在每一步都运行一个函数,计算 k=1,2,3,4 最近的邻居并取和(实际上是 k=所有邻居)。
###My function to compute k nearest neighbours from distance vector
knn <- function (vec,k) {
sum((sort(vec)[1:k+1]))
}
###My function to compute nearest neighbours iteratively for every vector
myfunc <- function (tab) {
rowsums <- numeric(nrow(tab)) ###Here I will save total sums
knnsums_log <- matrix(nrow=nrow(tab),ncol=4) ###Matrix for storing each of my kNN sums
for(i in 1:nrow(tab)) { ###For loop to compute distance and total sums
q<-as.matrix(rdist(tab[i,],tab))
rowsums[i] <- rowSums(q)
for (k in c(1:4)) { ###Nested loop to run my knn function
knnsums[i,k] <- knn(q,k)
}
}
return(cbind(rowsums,knnsums_log))
}
数据样例(634k 行)
X1 X2 X3 X4 X5 X6
1 0.00 0.02 0 0 0.02 -0.263309267
2 0.00 0.02 0 0 0.02 -0.171764667
3 0.00 0.02 0 0 0.02 -0.128784869
4 0.00 0.02 0 0 0.02 -0.905651733
对于那些不熟悉函数 rdist 的人,可以得到争论之间的欧几里得距离。它的工作速度比自定义编写的函数快得多。它比 dist 更适用,因为 dist 仅在矩阵距离内计算。从技术上讲,我知道这就是我正在做的事情,但 dist 试图将其存储在内存中,而且它太大了,甚至无法考虑这样做。
我怎样才能使上述工作更好?我试过弄乱应用函数,但没有得到任何有用的东西。我希望我已经清楚地解释了一切。如果我的数学是正确的,最坏的情况估计需要我一个多星期才能运行该代码。我有非常强大的服务器来处理它。但是没有 GPU。我还没有尝试过多核(应该有 12 个可用),但是我不知道如何为每个核委派。
感谢您的帮助。
【问题讨论】:
-
试试
parallels包和函数mcapply,它将为您完成分发。回到根本问题:如果有任何方法可以让您“智能猜测”您需要哪些最近邻集合,而不是计算所有这些集合,您或许可以减少所需的计算。
标签: r optimization for-loop distance neighbours