"norm" 等同于 "Euclidean distance" 吗?

Is "norm" equivalent to "Euclidean distance"?

我不确定"norm"和"Euclidean distance"是不是同一个意思。请你帮我区分一下。

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

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)

"norm" 的概念是数学中的一个广义概念,当应用于向量(或向量差)时,它广泛地表示某种长度度量。计算范数有多种不同的方法,但称为欧几里得距离的方法称为“2-范数”,它基于应用 2 的指数("square"),并在求和后应用 1 的指数/2("square root")。


the docs中有点神秘,但是你可以通过设置参数ord=2.

得到两个向量之间的欧氏距离

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

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

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

A norm 是一个函数,它将向量作为输入,returns 是一个标量值,可以解释为 "size"、"length" 或 "magnitude"那个向量。更正式地说,规范被定义为具有以下数学属性:

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

欧几里德范数(也称为 L² 范数)只是许多不同范数中的一种 - 还有最大范数、曼哈顿范数等。单个向量的 L² 范数相当于从指向原点,两个向量之差的L²范数等于两点间的欧式距离


正如@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))

最快的方法大概是scipy.spatial.distance.cdist:

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)