r - 优化我自己的 R 距离函数

标签 r function distance

我正在尝试为我的数据创建一个新的距离函数。但是,与 stats 包中的 dist 函数相比,我的代码的性能非常慢。例如,查看欧氏距离的结果:

mydist = function (x){

  euclidean = function (a, b){
    sqrt(sum((a-b)^2))
  }

  distances = matrix(0, nrow=nrow(x), ncol=nrow(x))
  for (i in 1:nrow(x))
    for (j in 1:(i-1)){  # <- corrected this
      if (j > 0){
         distances[i,j]=euclidean(x[i,], x[j,])
         distances[j,i]=distances[i,j]
      }
    }

  distances
}


m=matrix(1:800, ncol=2)
system.time(as.dist(mydist(m)))
  usuário   sistema decorrido 
    0.714     0.000     0.716      # <- updated values with corrected version

system.time(dist(m))
  usuário   sistema decorrido 
    0.004     0.000     0.002 

我不会使用欧氏距离。我正在开发一种新的,它使用一些特定于我的数据的统计数据,例如与代理包不同的统计数据,要复杂得多。我的数据集中有数百个变量和数千个示例(行)。不能等几个小时才计算距离。

我尝试了使用 external 和 apply 的另一个代码。它比两个循环更快,但仍然很慢。有人能提出什么建议吗?

最佳答案

关键是从整个矩阵中减去每一行,而不是每一行。由于减法是按列进行的,因此只需转置矩阵即可。

m=matrix(1:800, ncol=2)
system.time(a<-as.dist(mydist(m)))
# user  system elapsed
# 1.32    0.00    1.32 

t.m<-t(m)
system.time(x<-as.dist(apply(m,1,function(x) sqrt(colSums((x - t.m)^2)))))
# user  system elapsed
# 0.04    0.00    0.03 

any(x!=a) # FALSE

但是如果你真的想要速度,你应该使用 C 库。

关于r - 优化我自己的 R 距离函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751501/

相关文章:

arrays - 由于n-1维数组且没有循环,如何从n维数组中提取n-1维数组?

str_detect 中的正则表达式?

php - 将多次访问的具有常量值的数组放在哪里?

c - LLDB:每次调用时打印传递给函数的变量?

r - 获取一式三份记录的 rowSums 并仅保留具有最高值的记录

python - 使用循环(周期性)边界条件计算 numpy 数组中点之间距离的更快代码

python - 距离计算不起作用

r - 根据 R 中行的值向数据帧添加不同数量的列

r - 对各种迭代应用贝叶斯模型 (JAGS)

android - 可以在 Android 上检测到空间中固定点的距离(使用 x、y 和 z 坐标)?