¿Es “norma” equivalente a “distancia euclidiana”?

No estoy seguro de que “norma” y “distancia euclidiana” signifiquen lo mismo. Por favor, ¿podría ayudarme con esta distinción?

Tengo una matriz n por m a , donde m > 3. Quiero calcular la distancia de Eculidean entre el segundo punto de datos a[1,:] a todos los demás puntos (incluido él mismo). Así que utilicé np.linalg.norm , que np.linalg.norm la norma de dos puntos dados. Pero no sé si esta es la forma correcta de obtener los 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) 

Una norma es una función que toma un vector como entrada y devuelve un valor escalar que puede interpretarse como el “tamaño”, la “longitud” o la “magnitud” de ese vector. Más formalmente, las normas se definen como las que tienen las siguientes propiedades matemáticas:

  • Se escalan multiplicativamente, es decir, Norma (a · v ) = | a | · Norma ( v ) para cualquier escalar a
  • Satisfacen la desigualdad del triángulo, es decir, Norma ( u + v ) ≤ Norma ( u ) + Norma ( v )
  • La norma de un vector es cero si y solo si es el vector cero, es decir, Norma ( v ) = 0 ⇔ v = 0

La norma euclidiana (también conocida como norma L²) es solo una de muchas normas diferentes: también existe la norma máxima, la norma de Manhattan, etc. La norma L² de un solo vector es equivalente a la distancia euclidiana desde ese punto hasta el origen. , y la norma L² de la diferencia entre dos vectores es equivalente a la distancia euclidiana entre los dos puntos.


Como dice la respuesta de np.linalg.norm(x - y, ord=2) , np.linalg.norm(x - y, ord=2) (o simplemente np.linalg.norm(x - y) ) le dará la distancia euclidiana entre los vectores x y y .

Ya que desea calcular la distancia euclidiana entre a[1, :] y cada otra fila en a , puede hacer esto mucho más rápido eliminando el bucle for y transmitiendo a través de las filas de a :

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

También es fácil calcular la distancia euclidiana utilizando la transmisión:

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

El método más rápido es probablemente scipy.spatial.distance.cdist :

 from scipy.spatial.distance import cdist dist = cdist(a[1:2], a)[0] 

Algunos tiempos para una matriz (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) 

El concepto de “norma” es una idea generalizada en matemáticas que, cuando se aplica a vectores (o diferencias de vectores), representa en general una medida de longitud. Existen varios enfoques diferentes para calcular una norma, pero el llamado distancia euclidiana se denomina “norma 2” y se basa en la aplicación de un exponente de 2 (el “cuadrado”), y después de sumr la aplicación de un exponente de 1/2 (la raíz cuadrada”).


Es un poco críptico en los documentos , pero se obtiene la distancia euclidiana entre dos vectores al establecer el parámetro ord=2 .

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

se convierte en sqrt(sum(x**2)) .

Nota: según lo señalado por @Holt, el valor predeterminado es ord=None , que se documenta para calcular la “2-norma” para los vectores. Esto es, por lo tanto, equivalente a ord=2 (distancia euclidiana).