“范数”是否等同于“欧几里德距离”?

2024-05-20 01:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定“范数”和“欧几里德距离”是否是同一个意思。请你帮我区分一下。

我有一个nbym数组a,其中m>;3。我想计算第二个数据点a[1,:]到所有其他点(包括它自己)之间的Eculidean距离。所以我使用np.linalg.norm,它输出两个给定点的范数。但我不知道这是不是得到EDs的正确方法

import numpy as np

a = np.array([[0, 0, 0 ,0 ], [1, 1 , 1, 1],[2,2, 2, 3], [3,5, 1, 5]])
N = a.shape[0] # number of row
pos = a[1,:] # pick out the second data point. 
dist = np.zeros((N,1), dtype=np.float64)

for i in range(N):
    dist[i]= np.linalg.norm(a[i,:] - pos)

Tags: 数据posgt距离范数normdistnp
2条回答

norm是一个函数,它接受一个向量作为输入并返回一个标量值,该标量值可以解释为该向量的“大小”、“长度”或“大小”。更正式地说,规范被定义为具有以下数学性质:

  • 它们按倍数缩放,即范数(a·v)=| a |范数(v对于任何标量a
  • 它们满足三角形不等式,即范数(u+v)≤范数(u)+范数(v
  • 当且仅当向量为零向量时,向量的范数为零,即范数(v)=0⇔v=0

欧几里德范数(也称为L 2范数)只是许多不同范数中的一种,也有最大范数、曼哈顿范数等。单个向量的L 2范数等于从该点到原点的欧几里德距离,两向量差的L 2范数等价于两点间的欧几里德距离。


正如nobar的答案所说,np.linalg.norm(x - y, ord=2)(或者仅仅是np.linalg.norm(x - y))将给出向量xy之间的欧氏距离。

由于要计算a[1, :]a中的每一行之间的欧几里德距离,可以通过消除for循环并在a行上广播来更快地完成此操作:

dist = np.linalg.norm(a[1:2] - a, axis=1)

使用广播计算欧几里德距离也很容易:

dist = np.sqrt(((a[1:2] - a) ** 2).sum(1))

最快的方法可能是^{}

from scipy.spatial.distance import cdist

dist = cdist(a[1:2], a)[0]

(1000,1000)阵列的一些计时:

a = np.random.randn(1000, 1000)

%timeit np.linalg.norm(a[1:2] - a, axis=1)
# 100 loops, best of 3: 5.43 ms per loop

%timeit np.sqrt(((a[1:2] - a) ** 2).sum(1))
# 100 loops, best of 3: 5.5 ms per loop

%timeit cdist(a[1:2], a)[0]
# 1000 loops, best of 3: 1.38 ms per loop

# check that all 3 methods return the same result
d1 = np.linalg.norm(a[1:2] - a, axis=1)
d2 = np.sqrt(((a[1:2] - a) ** 2).sum(1))
d3 = cdist(a[1:2], a)[0]

assert np.allclose(d1, d2) and np.allclose(d1, d3)

“范数”的概念是数学中的一个广义概念,当应用于向量(或向量差异)时,它广泛地表示某种长度的度量。计算一个范数有各种不同的方法,但是一个叫做欧几里德距离的方法叫做“2范数”,它是基于应用2的指数(“平方”)和应用1/2的指数(“平方根”)的总和。


它在the docs中有点神秘,但是通过设置参数ord=2,可以得到两个向量之间的欧几里德距离。

sum(abs(x)**ord)**(1./ord)

变成sqrt(sum(x**2))

注意:正如@Holt所指出的,默认值是ord=None,它被记录为计算向量的“2-范数”。因此,这相当于ord=2(欧几里德距离)。

相关问题 更多 >