是“规范"吗?等同于“欧几里得距离"? [英] Is "norm" equivalent to "Euclidean distance"?

查看:109
本文介绍了是“规范"吗?等同于“欧几里得距离"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不确定范数"和欧几里得距离"是否是同一意思.请您能帮我这个区别.

I am not sure whether "norm" and "Euclidean distance" mean the same thing. Please could you help me with this distinction.

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

I have an n by m array a, where m > 3. I want to calculate the Eculidean distance between the second data point a[1,:] to all the other points (including itself). So I used the np.linalg.norm, which outputs the norm of two given points. But I don't know if this is the right way of getting the 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)

推荐答案

A 规范是将向量作为输入并返回标量值的函数,该标量值可以解释为该向量的大小",长度"或幅度".更正式地说,规范被定义为具有以下数学属性:

A norm is a function that takes a vector as an input and returns a scalar value that can be interpreted as the "size", "length" or "magnitude" of that vector. More formally, norms are defined as having the following mathematical properties:

  • 它们可乘以缩放,即对于任何标量 Norm(a· v )= | a |·Norm( v )一个
  • 它们满足三角形不等式,即 Norm( u + v )≤Norm( u )+ Norm( v )
  • 向量的范数在且仅当它是零向量时为零,即 Norm( v )= 0⇔ v = 0
  • They scale multiplicatively, i.e. Norm(a·v) = |a|·Norm(v) for any scalar a
  • They satisfy the triangle inequality, i.e. Norm(u + v) ≤ Norm(u) + Norm(v)
  • The norm of a vector is zero if and only if it is the zero vector, i.e. Norm(v) = 0 ⇔ v = 0

欧几里德范数(也称为L²范数)只是许多不同范数之一-还有最大范数,曼哈顿范数等.单个向量的L²范数等于从该点到欧几里德距离到原点,两个向量之差的L²范数等于两点之间的欧几里得距离.

The Euclidean norm (also known as the L² norm) is just one of many different norms - there is also the max norm, the Manhattan norm etc. The L² norm of a single vector is equivalent to the Euclidean distance from that point to the origin, and the L² norm of the difference between two vectors is equivalent to the Euclidean distance between the two points.

@nobar 的回答所述,np.linalg.norm(x - y, ord=2)(或仅仅是np.linalg.norm(x - y))将为您提供向量xy之间的欧几里得距离.

As @nobar's answer says, np.linalg.norm(x - y, ord=2) (or just np.linalg.norm(x - y)) will give you Euclidean distance between the vectors x and y.

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

Since you want to compute the Euclidean distance between a[1, :] and every other row in a, you could do this a lot faster by eliminating the for loop and broadcasting over the rows of a:

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

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

It's also easy to compute the Euclidean distance yourself using broadcasting:

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

最快的方法可能是 scipy.spatial.distance.cdist :

The fastest method is probably scipy.spatial.distance.cdist:

from scipy.spatial.distance import cdist

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


(1000、1000)数组的一些计时:


Some timings for a (1000, 1000) array:

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)

这篇关于是“规范"吗?等同于“欧几里得距离"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆