是"规范"相当于"欧几里德距离"?

时间:2015-08-21 13:41:27

标签: python arrays math numpy euclidean-distance

我不确定是否"规范"和"欧几里德距离"意思是一样的。请你帮我解决这个问题。

我有nm数组a,其中m> 3.我想计算第二个数据点a[1,:]与所有其他点(包括其自身)之间的Eculidean距离。所以我使用了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)

2 个答案:

答案 0 :(得分:30)

scipy.spatial.distance.cdist是一个函数,它将一个向量作为输入并返回一个标量值,该标量值可以解释为该向量的“大小”,“长度”或“大小”。更正式地,规范被定义为具有以下数学属性:

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

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

正如 @nobar 的回答所说,np.linalg.norm(x - y, ord=2)(或只是np.linalg.norm(x - y))会给出向量x和{{1}之间的欧几里德距离}。

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

a

使用广播自己计算欧氏距离也很容易:

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

最快的方法可能是{{3}}:

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

(1000,1000)数组的某些时间:

from scipy.spatial.distance import cdist

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

答案 1 :(得分:4)

"规范的概念"是数学中的一般概念,当应用于向量(或向量差异)时,广泛地代表一些长度的度量。计算范数有各种不同的方法,但称为欧几里德距离的方法称为" 2范数"并且基于应用指数2(" square"),并且在求和后应用1/2的指数("平方根")。

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

  

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

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

注意:正如@Holt所指出的,默认值是ord=None,它被记录以计算" 2-norm"对于矢量。因此,这相当于ord=2(欧几里德距离)。