Implementando la métrica de distancia de Minkowski

PythonBeginner
Practicar Ahora

Introducción

En este proyecto, aprenderás cómo implementar la función de distancia de Minkowski, una métrica de distancia generalizada que incluye medidas de distancia comúnmente utilizadas como las distancias euclidiana y manhattan. También aprenderás cómo probar y mejorar la función, así como cómo integrarla en un proyecto más grande.

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo implementar la función de distancia de Minkowski en Python
  • Cómo probar la función de distancia de Minkowski con diferentes parámetros de entrada
  • Cómo mejorar la función de distancia de Minkowski para manejar casos extremos
  • Cómo integrar la función de distancia de Minkowski en un proyecto más grande

🏆 Logros

Después de completar este proyecto, podrás:

  • Calcular distancias de Minkowski entre dos puntos
  • Manejar diferentes tipos de parámetros de entrada para la función de distancia de Minkowski
  • Probar y mejorar una función para mejorar su robustez
  • Integrar una función personalizada en un proyecto más grande

Implementar la función de distancia de Minkowski

En este paso, aprenderás cómo implementar la función de distancia de Minkowski en Python. Siga los pasos siguientes para completar este paso:

Abra el archivo minkowski_distance.py en su editor de código.

Implemente la función minkowski_distance con la siguiente lógica:

from typing import List, Union
import numpy as np

def minkowski_distance(
    point_a: List[float], point_b: List[float], p: Union[int, str]
) -> float:
    """
    Calcular la distancia de Minkowski entre dos puntos.

    Esta función calcula la distancia de Minkowski entre dos puntos representados como listas
    de valores numéricos. La distancia de Minkowski es una generalización de otras métricas
    de distancia como las distancias euclidiana y manhattan.

    Parámetros:
    - point_a (List[float]): Las coordenadas del primer punto.
    - point_b (List[float]): Las coordenadas del segundo punto.
    - p (Union[int, str]): El parámetro de exponente para el cálculo de la distancia de Minkowski.
      - Si p es un entero mayor o igual a 1, se calcula la distancia de p-norma.
      - Si p es 'INF', se calcula la distancia de norma infinita (Chebyshev).

    Devuelve:
    - float: La distancia de Minkowski entre los dos puntos. Si se proporciona un valor no válido de p,
      devuelve -1.
    """

    if isinstance(p, int) and p >= 1:
        distance = np.power(
            np.sum(np.abs(np.array(point_a) - np.array(point_b)) ** p), 1 / p
        )
    elif p == "INF":
        distance = np.max(np.abs(np.array(point_a) - np.array(point_b)))
    else:
        distance = -1
    return float(distance)

Explicación

Primero, importamos los módulos necesarios.

Luego, definimos la función minkowski_distance que toma tres parámetros: point_a, point_b y p.

La función calcula la distancia de Minkowski:

  • Si p es un entero mayor o igual a 1, calcula la distancia de p-norma usando la fórmula:
    [
    \text{distancia} = \left( \sum \left| \text{point_a} - \text{point_b} \right|^p \right)^{1/p}
    ]
  • Si p es "INF", calcula la distancia de norma infinita (Chebyshev) usando la fórmula:
    [
    \text{distancia} = \max \left| \text{point_a} - \text{point_b} \right|
    ]
  • Si p no es válido, devuelve -1.0.
✨ Revisar Solución y Practicar

Probar la función de distancia de Minkowski

En este paso, probarás la función minkowski_distance con diferentes parámetros de entrada. Siga los pasos siguientes para completar este paso:

Abra el archivo minkowski_distance.py en su editor de código.

Agregue los siguientes casos de prueba al final del archivo:

if __name__ == "__main__":
    a = [1, 0]
    b = [2, 0]
    p = 2
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## Salida esperada: a=[1, 0], b=[2, 0], p=2, distance=1.0

    a = [4, 9, 10]
    b = [2, 0, -3]
    p = "INF"
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## Salida esperada: a=[4, 9, 10], b=[2, 0, -3], p=INF, distance=13.0

    a = [1, 4, 10, 0]
    b = [20, -3, -5, 0]
    p = -10
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## Salida esperada: a=[1, 4, 10, 0], b=[20, -3, -5, 0], p=-10, distance=-1.0

Ejecute el archivo minkowski_distance.py usando el siguiente comando:

python minkowski_distance.py

Verifique que la salida coincida con los resultados esperados:

  • Para los puntos a = [1, 0] y b = [2, 0] con p = 2, la distancia debe ser 1.0.
  • Para los puntos a = [4, 9, 10] y b = [2, 0, -3] con p = "INF", la distancia debe ser 13.0.
  • Para los puntos a = [1, 4, 10, 0] y b = [20, -3, -5, 0] con p = -10, la distancia debe ser -1.0.
✨ Revisar Solución y Practicar

Resumen

¡Felicidades! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.