【问题标题】:Recalculating distance matrix重新计算距离矩阵
【发布时间】:2012-12-02 20:34:03
【问题描述】:

我有一个很大的输入矩阵 (4000x10000)。我使用dist()为其计算欧几里得距离矩阵(大约需要5个小时)。
我需要计算带有附加行的“相同”矩阵的距离矩阵(对于 4001x10000 矩阵)。在不重新计算整个矩阵的情况下确定距离矩阵的最快方法是什么?

【问题讨论】:

  • 你知道怎么做,但在 R 中不知道,或者你不知道怎么做?
  • 额外的行是额外的点还是额外的变量/维度?

标签: r distance


【解决方案1】:

我假设你的额外行意味着额外的点。如果这意味着一个额外的变量/维度,它将需要一个不同的答案。

首先,对于矩阵的欧式距离,我推荐fields 包中的rdist 函数。它是用 Fortran 编写的,比 dist 函数快很多。它返回一个matrix 而不是dist 对象,但您始终可以使用as.matrixas.dist 从一个对象转到另一个对象。

这里是(小于你的)示例数据

num.points <- 400
num.vars   <- 1000
original.points <- matrix(runif(num.points * num.vars),
                          nrow = num.points, ncol = num.vars)

以及您已经计算出的距离矩阵:

d0 <- rdist(original.points)

对于额外点,您只需要计算额外点之间的距离以及额外点与原始点之间的距离。我将使用两个额外的点来表明该解决方案对于任意数量的额外点都是通用的:

extra.points <- matrix(runif(2 * num.vars), nrow = 2)
inner.dist   <- rdist(extra.points)
outer.dist   <- rdist(extra.points, original.points)

这样您就可以将它们绑定到更大的距离矩阵:

d1 <- rbind(cbind(d0, t(outer.dist)),
            cbind(outer.dist, inner.dist))

让我们检查它是否与完整、长时间的重新运行所产生的结果相匹配:

d2 <- rdist(rbind(original.points, extra.points))

identical(d1, d2)
# [1] TRUE

【讨论】:

  • 我尝试使用:mydist
  • 距离矩阵是方阵。您只在末尾添加一行,您还应该在末尾添加一列,右下角的值应该为零(额外点与自身之间的距离)。但请阅读我的解决方案...
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多