민코프스키 거리 메트릭 구현

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 유클리드 거리 (Euclidean distance) 및 맨해튼 거리 (Manhattan distance) 와 같은 일반적으로 사용되는 거리 척도를 포함하는 일반화된 거리 메트릭인 민코프스키 거리 함수 (Minkowski distance function) 를 구현하는 방법을 배우게 됩니다. 또한 이 함수를 테스트하고 개선하는 방법과 더 큰 프로젝트에 통합하는 방법도 배우게 됩니다.

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다.

  • Python 에서 민코프스키 거리 함수를 구현하는 방법
  • 다양한 입력 매개변수를 사용하여 민코프스키 거리 함수를 테스트하는 방법
  • 엣지 케이스 (edge cases) 를 처리하도록 민코프스키 거리 함수를 개선하는 방법
  • 민코프스키 거리 함수를 더 큰 프로젝트에 통합하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • 두 점 사이의 민코프스키 거리를 계산할 수 있습니다.
  • 민코프스키 거리 함수에 대한 다양한 유형의 입력 매개변수를 처리할 수 있습니다.
  • 함수의 견고성을 향상시키기 위해 함수를 테스트하고 개선할 수 있습니다.
  • 사용자 정의 함수를 더 큰 프로젝트에 통합할 수 있습니다.

민코프스키 거리 함수 구현

이 단계에서는 Python 에서 민코프스키 거리 함수를 구현하는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요.

코드 편집기에서 minkowski_distance.py 파일을 엽니다.

다음 로직으로 minkowski_distance 함수를 구현합니다.

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:
    """
    두 점 사이의 민코프스키 거리를 계산합니다.

    이 함수는 숫자 값의 리스트로 표현된 두 점 사이의 민코프스키 거리를 계산합니다. 민코프스키 거리는 유클리드 거리 및 맨해튼 거리와 같은 다른 거리 척도의 일반화입니다.

    매개변수:
    - point_a (List[float]): 첫 번째 점의 좌표.
    - point_b (List[float]): 두 번째 점의 좌표.
    - p (Union[int, str]): 민코프스키 거리 계산을 위한 지수 매개변수.
      - p 가 1 이상인 정수인 경우, p-norm 거리가 계산됩니다.
      - p 가 'INF'인 경우, 무한대-norm (체비쇼프) 거리가 계산됩니다.

    반환값:
    - float: 두 점 사이의 민코프스키 거리. p 의 유효하지 않은 값이 제공되면 -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)

설명

먼저, 필요한 모듈을 가져옵니다.

그런 다음, point_a, point_b, p의 세 가지 매개변수를 사용하는 minkowski_distance 함수를 정의합니다.

이 함수는 민코프스키 거리를 계산합니다.

  • p가 1 이상인 정수인 경우, 다음 공식을 사용하여 p-norm 거리를 계산합니다.
    [
    \text{distance} = \left( \sum \left| \text{point_a} - \text{point_b} \right|^p \right)^{1/p}
    ]
  • p가 "INF"인 경우, 다음 공식을 사용하여 무한대-norm (체비쇼프) 거리를 계산합니다.
    [
    \text{distance} = \max \left| \text{point_a} - \text{point_b} \right|
    ]
  • p가 유효하지 않은 경우, -1.0을 반환합니다.
✨ 솔루션 확인 및 연습

민코프스키 거리 함수 테스트

이 단계에서는 다양한 입력 매개변수를 사용하여 minkowski_distance 함수를 테스트합니다. 이 단계를 완료하려면 아래 단계를 따르세요.

코드 편집기에서 minkowski_distance.py 파일을 엽니다.

파일 하단에 다음 테스트 케이스를 추가합니다.

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

다음 명령을 사용하여 minkowski_distance.py 파일을 실행합니다.

python minkowski_distance.py

출력이 예상 결과와 일치하는지 확인합니다.

  • a = [1, 0]b = [2, 0]에 대해 p = 2인 경우 거리는 1.0이어야 합니다.
  • a = [4, 9, 10]b = [2, 0, -3]에 대해 p = "INF"인 경우 거리는 13.0이어야 합니다.
  • a = [1, 4, 10, 0]b = [20, -3, -5, 0]에 대해 p = -10인 경우 거리는 -1.0이어야 합니다.
✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.