【问题标题】:How to calculate Euclidean distance in R for n-dimensions?如何计算 R 中 n 维的欧几里得距离?
【发布时间】:2021-02-28 19:48:59
【问题描述】:

我正在尝试编写一个函数来计算跨 n 维的两点之间的欧几里得距离。

我有以下代码:

euc_dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))

这适用于x1x2 两点之间。但是,我正在尝试对两点之间的 n 维执行此操作。

例如,在 Python 中,它适用于:

def euc_distance(p, q):
    return math.sqrt(sum((px - qx) ** 2 for px, qx in zip(p, q)))

即您可以输入例如三个维度(两点之间):

euc_distance([2, 1, 4], [4, 9, 8])

如何编辑我的 R 代码来做同样的事情?

【问题讨论】:

  • 看看?distdist(rbind(c(0,3,0), c(4,0,0)))
  • 谢谢 - 但我正在尝试编写函数而不是使用 dist。有什么建议吗? @GKi

标签: r function euclidean-distance


【解决方案1】:

你可以使用dist:

dist(x)
#         1
#2 9.165151

或每手使用applydiff

sqrt(sum(apply(x, 2, diff)^2))
#sqrt(sum((x[1,] - x[2,])^2)) #Alternative
#[1] 9.165151

数据:

x <- rbind(c(2,1,4), c(4,9,8))

【讨论】:

    【解决方案2】:

    除了其他答案,可以使用norm

    x1 <- c(2,1,4)
    x2 <- c(4,9,8)
    norm(as.matrix(x1 - x2), "F")
    #R> [1] 9.165151
    

    【讨论】:

      【解决方案3】:

      正如评论中所指出的,您可以使用函数dist(),它返回行之间的欧几里德距离,而不管列数(维度)如何。或者,如果你想使用你的函数,你可以这样做:

      euc_dist <- function(x1, x2){
       return(sqrt(sum((x1 - x2)^2)))
      }
      

      不要忘记R函数末尾的return(),这是一个常见的“错误”,会带来不必要的麻烦 在将输入传递给函数时,请改为这样做,因为这是在 R 中使用向量的正确方法:

      euc_dist(c(2, 1, 4), c(4, 9, 8))
      

      【讨论】:

      • 不需要return。试试:euc_dist &lt;- function(x1, x2) {sqrt(sum((x1 - x2)^2))} 也可以。
      • 同意。尽管如此,在编写更复杂的函数时,我认为这对我们自己和其他人都有帮助,重用代码以明确每个函数返回的内容。这是一个简单的案例;在更复杂的函数中,三个月后,我们可能不记得函数应该返回什么
      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2018-01-28
      • 2020-11-29
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多