我正在迭代使用rdist,以便为大型数据集计算最近的邻居。目前,我有一个相当小的矩阵,其中包含64,000列的634,000个向量。
如前所述,我正在使用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个可用),但是我又不知道如何为每个核委派。
感谢您的帮助。
几个技巧:
0)使用Rprof以及line.profiling选项配置代码
1)R中的矩阵是列式的。因为您比较了它们之间的向量,所以将它们存储为矩阵的列会更快。
2)我不知道rdist函数从哪里来,但是您应该避免使用as.matrix(rdist(tab [i,],tab))复制并创建一个新矩阵
3)您可以优化knn()函数,该函数对相同向量进行4倍排序
4)为什么不只是rdist(tab)?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句