在R中使用嵌套循环进行优化(向量化?)

阿图尔·莫特鲁克(Artur Motruk)

我正在迭代使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++优化向量化嵌套循环

来自分类Dev

向量化嵌套 for 循环 r

来自分类Dev

向量化嵌套循环

来自分类Dev

R-通过对大小不同的序列进行条件处理来加快嵌套循环(向量化?)的速度

来自分类Dev

使用API调用向量化R循环

来自分类Dev

向量化嵌套的循环Python

来自分类Dev

向量化嵌套的循环Python

来自分类Dev

向量化这些嵌套在R中的for循环

来自分类Dev

优化/向量化R中的循环,该循环从输入向量的范围生成随机数?

来自分类Dev

使用条件和函数向量化嵌套循环

来自分类Dev

使用R优化/向量化数据库查询

来自分类Dev

如何在R中向量化for循环以进行坐标计算?

来自分类Dev

如何使用向量化而不是循环来优化我的R代码以消除数据帧中逐行重复的NEIGHBORING

来自分类Dev

在APL中使用嵌套向量进行索引

来自分类Dev

用lapply向量化嵌套循环

来自分类Dev

向量化numpy多条件嵌套循环

来自分类Dev

向量化嵌套的for循环和if语句

来自分类Dev

Python向量化嵌套的图像处理循环

来自分类Dev

在Matlab中向量化而不是嵌套循环

来自分类Dev

3 个嵌套 for 循环的 Matlab 向量化

来自分类Dev

使用Numpy向量化循环

来自分类Dev

使用Numpy向量化的循环

来自分类Dev

向量化而不使用循环

来自分类Dev

R使用先前的迭代值向量化FOR循环

来自分类Dev

如何使用for循环在r中向量化我的代码?

来自分类Dev

在python中使用重复索引对循环进行矢量化

来自分类Dev

我需要使用numpy的向量化来优化我的double for循环

来自分类Dev

需要使用循环对函数进行向量化(用向量中的值替换NA行)

来自分类Dev

使用循环(或向量化)通过向量中的多个元素对列表进行子集化

Related 相关文章

热门标签

归档