r - 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
为什么我得到不同的结果?
如果我错了,如何解决这个问题?
解决方案
你需要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 范数。x1
x2
c(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”对于矩阵和向量的含义也不同。