Métricas de Distancia en Machine Learning

Las métricas de distancia son fundamentales en algoritmos de machine learning como K-Nearest Neighbors (KNN), clustering y otros métodos que dependen de la similitud entre puntos de datos.

ML 20 : Distance Metrics Models | Euclidean | Manhattan | Minkowski | Hamming Distance with [09:52]

1. Distancia Euclidiana

La distancia Euclidiana es una de las métricas más utilizadas para medir la cercanía entre dos puntos en un espacio multidimensional. Es equivalente a la distancia en línea recta entre dos puntos.

1.1. Fórmula

La fórmula de la Distancia Euclidiana entre dos puntos A(x1,y1,z1,… ) y B(x2,y2,z2,… ) en un espacio n-dimensional es:

Donde:

  • n: Número de dimensiones (pueden ser 2, 3, o más).
  • xi​: Coordenadas del punto A.
  • yi​: Coordenadas del punto B.

1.2. Ventajas

  • Fácil de interpretar.
  • Adecuada para datos con relaciones continuas y lineales.

1.3. Desventajas

  • Sensible a la escala de las variables. Es importante normalizar los datos antes de usar esta métrica.

1.4. Snippet de código

Código 01.py

def euclidean_distance(x, y):
    dist = 0.0
    for i in range(len(x)):
        dist += (x[i] - y[i])**2
    return sqrt(dist)

print(euclidean_distance([1,2,3],[4,5,6]))

Salida:

5.196152422706632 

2. Distancia Manhattan

La distancia Manhattan, también conocida como distancia de la “ciudad” o “taxista” (Geometría del taxista), mide la distancia entre dos puntos sumando las diferencias absolutas en cada dimensión.

2.1. Fórmula

2.2. Ventajas

  • Menos sensible a outliers en comparación con la distancia Euclidiana.
  • Adecuada para datos donde el movimiento está restringido a ejes rectos.

2.3. Desventajas

  • Puede no ser intuitiva en algunos contextos donde se espera una “línea recta” como referencia.

2.4. Snippet de código

Código 02.py

def manhattan_distance(x, y):
    dist = 0.0
    for i in range(len(x)):
        dist += abs(x[i] - y[i])
    return dist

print(manhattan_distance([1,2,3],[4,5,6]))

Salida:

9.0

3. Distancia de Minkowski

La distancia de Minkowski es una generalización de las distancias Euclidiana y Manhattan. Su parámetro p define qué tipo de distancia calcular.

3.1. Fórmula

  • Cuando p = 2: Distancia Euclidiana.
  • Cuando p = 1: Distancia Manhattan.

3.2. Ventajas

  • Muy flexible, ya que se puede ajustar el valor de p según el problema.

3.3. Desventajas

  • La interpretación del parámetro p puede ser compleja en algunos casos.

3.4. Snippet de código

Código 03.py

def minkowski_distance(x, y, p=1):
    dist = 0.0
    for i in range(len(x)):
        dist += abs((x[i] - y[i])**p)
    return dist** (1/p)


print('When p=1 it is Manhattan distance: ' ,minkowski_distance([1,2,3],[4,5,6]))
print('When p=2 it is Euclidean distance:',minkowski_distance([1,2,3],[4,5,6], p=2))

Salida:

When p=1 it is Manhattan distance:  9.0
When p=2 it is Euclidean distance: 5.196152422706632

4. Otras Métricas Especializadas

En ciertos contextos, las métricas tradicionales pueden no ser ideales. Algunas métricas especializadas incluyen:

4.1. Distancia Coseno

Mide el ángulo entre dos vectores en un espacio multidimensional, en lugar de su distancia absoluta.

Donde cos⁡θ es el coseno del ángulo entre los vectores x e y, calculado como:

Por lo tanto, la distancia coseno se calcula como:

  • Valor entre -1 y 1.
  • Común en procesamiento de texto y sistemas de recomendación.

4.1.1. Snippet de código

Código 04.py

import numpy as np

def distancia_coseno(x, y):
    x = np.array(x)
    y = np.array(y)
    
    # Producto escalar
    producto_escalar = np.dot(x, y)
    
    # Normas (magnitudes) de los vectores
    norma_x = np.linalg.norm(x)
    norma_y = np.linalg.norm(y)
    
    # Coseno del ángulo
    coseno_similitud = producto_escalar / (norma_x * norma_y)
    
    # Distancia coseno
    distancia = 1 - coseno_similitud
    
    return distancia

# Ejemplo de uso
vector1 = [1, 2, 3]
vector2 = [4, 5, 6]

resultado = distancia_coseno(vector1, vector2)
print(f"La distancia coseno es: {resultado:.4f}")

Salida:

La distancia coseno es: 0.0254

4.2. Distancia Hamming

La Distancia de Hamming cuenta el número de posiciones en las que dos cadenas de caracteres o binarios son diferentes.

  • Utilizada en códigos de corrección de errores y clasificación binaria.

4.2.1. Snippet de código

Código 05.py

def hamming_distance(array_1, array_2):
    
    if len(array_1) != len(array_2):
        message = 'Both the arrays should have equal lengths'
        return message
    else:
        common_character_count = 0
        for i in range(len(array_1)):
            if array_1[i] != array_2[i]:
                common_character_count += 1
            else:
                continue
        return common_character_count
    
print(hamming_distance('shweta', 'sharma'))

Salida:

3

5. ¿Cuál elegir?

La selección de la métrica de distancia depende del contexto del problema:

  • Datos continuos y normalizados: Distancia Euclidiana.
  • Datos con restricciones de movimiento: Distancia Manhattan.
  • Flexibilidad: Distancia de Minkowski.
  • Textos o vectores escasos: Similitud Coseno.
  • Correlación entre variables: Distancia Mahalanobis.

Cada métrica tiene sus ventajas y desventajas, y la correcta elección puede mejorar significativamente el desempeño de un modelo.


6. Referencias