首页 > 解决方案 > R:使用不同方法计算两个向量之间的欧几里得距离时结果不同

问题描述

假设我有两个向量。

x1 = c(-1, 2, 3)
x2 = c(4, 0, -3)

为了计算欧几里得距离,我使用了三种不同的方法

1-内置功能norm

s = cbind(x1, x2)
norm(s, "2")
#[1] 5.797896

2-手算

sqrt(sum(x2 - x1) ^ 2)
#[1] 8.062258

3-自定义功能

lpnorm <- function(x, p){  
  n <- sum(abs(x) ^ p) ^ (1 / p)
  return(n)
  }

lpnorm(s, 2)
#[1] 6.244998

为什么我得到不同的结果?

如果我错了,如何解决这个问题?

标签: reuclidean-distance

解决方案


你需要s = x2 - x1.

norm(s, "2")
#[1] 8.062258

sqrt(sum(s ^ 2))  ## or: sqrt(c(crossprod(s)))
#[1] 8.062258

lpnorm(s, 2)
#[1] 8.062258

如果您定义,您列出的所有选项都不会计算和s = cbind(x1, x2)之间的欧几里得距离,但我们仍然可以让它们输出相同的值。在这种情况下,它们是向量的 L2 范数。x1x2c(x1, x2)

norm(s, "F")
#[1] 6.244998

sqrt(sum(s ^ 2))
#[1] 6.244998

lpnorm(s, 2)
#[1] 6.244998

最后,norm不是计算距离的常用方法。它确实适用于矩阵范数。当你这样做时norm(cbind(x1, x2), "2"),它会计算 L2 矩阵范数,它是矩阵的最大奇异值cbind(x1, x2)


所以我的问题是定义s. 好的,如果我有三个以上的向量怎么办?

在这种情况下,您需要成对的欧几里得矩阵。见功能?dist

我有训练集(包含三行或更多行)和一个测试集(一行)。所以,我想计算欧几里得距离或者可能是其他距离。这就是为什么我要确定距离计算的原因。

你想要一个向量和许多其他向量之间的距离,结果是一个向量?

set.seed(0)
X_train <- matrix(runif(10), 5, 2)
x_test <- runif(2)
S <- t(X_train) - x_test

apply(S, 2, norm, "2")  ## don't try other types than "2"
#[1] 0.8349220 0.7217628 0.8012416 0.6841445 0.9462961

apply(S, 2, lpnorm, 2)
#[1] 0.8349220 0.7217628 0.8012416 0.6841445 0.9462961

sqrt(colSums(S ^ 2))  ## only for L2-norm
#[1] 0.8349220 0.7217628 0.8012416 0.6841445 0.9462961

我会再次强调,这norm将在向量上失败,除非type = "2". ?norm明确表示此功能适用于matrix。与您norm自定义的lpnorm函数有很大不同。lpnorm矢量范数norm矩阵范数。甚至“L2”对于矩阵和向量的含义也不同。


推荐阅读