소개
이 프로젝트에서는 유클리드 거리 (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 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.



