【问题标题】:Is "norm" equivalent to "Euclidean distance"?“范数”是否等同于“欧几里得距离”?
【发布时间】:2015-08-21 13:41:26
【问题描述】:

我不确定“范数”和“欧几里得距离”是否是同一个意思。请你帮我解决这个区别。

我有一个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)

【问题讨论】:

    标签: python arrays math numpy euclidean-distance


    【解决方案1】:

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

    • 它们以乘法方式缩放,即 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))将为您提供向量 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)
    

    【讨论】:

      【解决方案2】:

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


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

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

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

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

      【讨论】:

      • 您还可以使用默认的None 值获得它。
      • @Holt:谢谢,我没注意到。默认值为None,它计算“2-norm”,大概匹配ord=2
      • 对于“2-范数”的所有讨论似乎是一种耻辱,而没有提及它最著名的形式:勾股定理。
      猜你喜欢
      • 2013-03-02
      • 2015-07-15
      • 2014-02-04
      • 1970-01-01
      • 2021-10-01
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多