【问题标题】:Is there is a fast way to calculate Bray distance between two datasets?有没有一种快速的方法来计算两个数据集之间的布雷距离?
【发布时间】:2021-07-03 06:21:51
【问题描述】:

我没有为 R 包中的两个数据集找到合适的布雷距离(Bray-Curtis 指数)函数。所以我创建了一个,但它非常耗时。有没有更快的方法来做到这一点?

    bray_dist <- function(a, b) {
      a_len = dim(a)[1]
      b_len = dim(b)[1]
      distmatrix = matrix(data=NA, nrow=a_len, ncol=b_len)
      for(i in seq(1,a_len)) {
        for(j in seq(1,b_len)) {
          distmatrix[i,j] = 2*sum(pmin(a[i,], b[j,]))/(sum(a[i,]) + sum(b[j,]))
        }
      }
      return(distmatrix)
    }

这里是数据的例子,我的真实数据比这个大,而且因为我重复了很多次所以需要很长时间

a <- matrix( round(rnorm(400, 4)), ncol=5)
b <- matrix( round(rnorm(500, 5)), ncol=5)

如果我使用 bray_dist 函数,则需要 9.700986 秒

tstart<-Sys.time()
for (i in 1:100){
 c<-bray_dist(a,b)
}
Sys.time()-tstart

如果使用下面 Mohanasundaram 所示的 b_dist,则需要 8.709085 秒,比上一个要好,但仍然没有那么好。

tstart<-Sys.time()
for (i in 1:100){
 c<-b_dist(a,b)
}
Sys.time()-tstart

【问题讨论】:

标签: r distance similarity


【解决方案1】:

使用应用功能,我可以看到 100 x 100 矩阵的 0.03 秒差异

b_dist <- function(a, b){
  d <- t(apply(a, 1, function(x) apply(b, 1, function (y) 2*sum(pmin(x, y)/(sum(x) + sum(y))))))
  return(d)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2020-08-05
    • 2020-12-18
    • 2020-01-01
    相关资源
    最近更新 更多