Implementando a Métrica de Distância de Minkowski

PythonBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como implementar a função de distância de Minkowski, uma métrica de distância generalizada que inclui medidas de distância comumente usadas, como as distâncias euclidiana e Manhattan. Você também aprenderá como testar e refinar a função, bem como como integrá-la em um projeto maior.

🎯 Tarefas

Neste projeto, você aprenderá:

  • Como implementar a função de distância de Minkowski em Python
  • Como testar a função de distância de Minkowski com diferentes parâmetros de entrada
  • Como refinar a função de distância de Minkowski para lidar com casos extremos (edge cases)
  • Como integrar a função de distância de Minkowski em um projeto maior

🏆 Conquistas

Após concluir este projeto, você será capaz de:

  • Calcular as distâncias de Minkowski entre dois pontos
  • Lidar com diferentes tipos de parâmetros de entrada para a função de distância de Minkowski
  • Testar e refinar uma função para melhorar sua robustez
  • Integrar uma função personalizada em um projeto maior

Implementar a Função de Distância de Minkowski

Nesta etapa, você aprenderá como implementar a função de distância de Minkowski em Python. Siga as etapas abaixo para concluir esta etapa:

Abra o arquivo minkowski_distance.py no seu editor de código.

Implemente a função minkowski_distance com a seguinte 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 a distância de Minkowski entre dois pontos.

    Esta função calcula a distância de Minkowski entre dois pontos representados como listas
    de valores numéricos. A distância de Minkowski é uma generalização de outras métricas de distância
    como as distâncias euclidiana e Manhattan.

    Parâmetros:
    - point_a (List[float]): As coordenadas do primeiro ponto.
    - point_b (List[float]): As coordenadas do segundo ponto.
    - p (Union[int, str]): O parâmetro expoente para o cálculo da distância de Minkowski.
      - Se p for um inteiro maior ou igual a 1, a distância p-norm é calculada.
      - Se p for 'INF', a distância infinito-norm (Chebyshev) é calculada.

    Retorna:
    - float: A distância de Minkowski entre os dois pontos. Se um valor inválido de p for
      fornecido, ele retorna -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)

Explicação

Primeiro, importamos os módulos necessários.

Em seguida, definimos a função minkowski_distance que recebe três parâmetros: point_a, point_b e p.

A função calcula a distância de Minkowski:

  • Se p for um inteiro maior ou igual a 1, ela calcula a distância p-norm usando a fórmula:
    [
    \text{distance} = \left( \sum \left| \text{point_a} - \text{point_b} \right|^p \right)^{1/p}
    ]
  • Se p for "INF", ela calcula a distância infinito-norm (Chebyshev) usando a fórmula:
    [
    \text{distance} = \max \left| \text{point_a} - \text{point_b} \right|
    ]
  • Se p não for válido, ela retorna -1.0.
✨ Verificar Solução e Praticar

Testar a Função de Distância de Minkowski

Nesta etapa, você testará a função minkowski_distance com diferentes parâmetros de entrada. Siga as etapas abaixo para concluir esta etapa:

Abra o arquivo minkowski_distance.py no seu editor de código.

Adicione os seguintes casos de teste no final do arquivo:

if __name__ == "__main__":
    a = [1, 0]
    b = [2, 0]
    p = 2
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## Expected output: 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=}")  ## Expected output: 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=}")  ## Expected output: a=[1, 4, 10, 0], b=[20, -3, -5, 0], p=-10, distance=-1.0

Execute o arquivo minkowski_distance.py usando o seguinte comando:

python minkowski_distance.py

Verifique se a saída corresponde aos resultados esperados:

  • Para os pontos a = [1, 0] e b = [2, 0] com p = 2, a distância deve ser 1.0.
  • Para os pontos a = [4, 9, 10] e b = [2, 0, -3] com p = "INF", a distância deve ser 13.0.
  • Para os pontos a = [1, 4, 10, 0] e b = [20, -3, -5, 0] com p = -10, a distância deve ser -1.0.
✨ Verificar Solução e Praticar

Resumo

Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.