Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 이해하는 민코프스키 거리(Minkowski Distance): 개념부터 구현까지

민코프스키 거리란 무엇인가?

민코프스키 거리(Minkowski Distance)는 노름 벡터 공간(normed vector space)에서 정의되는 거리 측도(metric)로, 두 벡터 간의 유사도를 측정하는 데 널리 사용됩니다. 이 거리는 민코프스키 부등식(Minkowski inequality)을 만족하며, 매개변수 p 값을 조절함으로써 여러 가지 잘 알려진 거리 척도로 일반화할 수 있다는 점이 큰 특징입니다.

민코프스키 거리의 수식은 다음과 같습니다.

D(x, y) = ( Σ |xᵢ − yᵢ|^p )^(1/p)

p 값에 따라 대표적인 거리 척도가 다음과 같이 결정됩니다.

  • p = 1: 맨해튼 거리(Manhattan Distance) — 각 좌표 차이의 절댓값 합
  • p = 2: 유클리드 거리(Euclidean Distance) — 우리가 흔히 아는 직선 거리
  • p → ∞: 체비셰프 거리(Chebyshev Distance) — 좌표 차이의 최댓값

SciPy를 활용한 민코프스키 거리 계산

파이썬의 과학 계산 라이브러리인 SciPy에서는 scipy.spatial.distance.minkowski 함수를 통해 손쉽게 민코프스키 거리를 계산할 수 있습니다. 세 번째 인자로 p 값을 전달하면 됩니다.

>>> from scipy.spatial import distance
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 1)
2.0
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 2)
1.4142135623730951
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 3)
1.2599210498948732
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 1)
1.0
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 2)
1.0
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 3)
1.0

위 실행 결과를 보면 흥미로운 패턴을 발견할 수 있습니다. 동일한 두 벡터라도 p 값이 커질수록 계산되는 거리 값은 점점 작아집니다. 또한 차이가 하나의 좌표축에만 존재하는 경우([1, 1, 0] vs [0, 1, 0])에는 p 값과 무관하게 거리가 항상 1.0으로 동일하게 나타납니다.

예제 코드: 직접 구현하기

라이브러리에 의존하지 않고 민코프스키 거리를 직접 구현할 수도 있습니다. 아래 코드는 n제곱근을 계산하는 헬퍼 함수와 이를 활용해 민코프스키 거리를 구하는 함수로 구성되어 있습니다.

from math import *
from decimal import Decimal

def my_p_root(value, root):
    my_root_value = 1 / float(root)
    return round(Decimal(value) ** Decimal(my_root_value), 3)

def my_minkowski_distance(x, y, p_value):
    return (my_p_root(sum(pow(abs(a - b), p_value)
        for a, b in zip(x, y)), p_value))

# Driver Code
vector1 = [0, 2, 3, 4]
vector2 = [2, 4, 3, 7]
my_position = 5
print("The Distance is::", my_minkowski_distance(vector1, vector2, my_position))

코드 설명

  • my_p_root: value의 root 제곱근을 계산합니다. Decimal 타입을 사용해 부동소수점 오차를 줄이고 소수 셋째 자리까지 반올림합니다.
  • my_minkowski_distance: zip으로 두 벡터의 요소를 짝지어 각 차이의 절댓값을 p제곱한 뒤 모두 더하고, 마지막으로 1/p 제곱근을 취해 최종 거리를 반환합니다.

실행 결과

The Distance is:: 3.144

벡터 [0, 2, 3, 4]와 [2, 4, 3, 7] 사이의 민코프스키 거리(p = 5)는 약 3.144로 계산됩니다.

정리

민코프스키 거리는 머신러닝의 KNN(K-최근접 이웃) 알고리즘, 클러스터링 등 다양한 분야에서 활용되는 핵심적인 거리 척도입니다. p 값을 조절하는 것만으로 맨해튼 거리와 유클리드 거리를 모두 표현할 수 있는 유연성 덕분에, 데이터의 특성에 맞는 거리 척도를 선택하는 데 매우 유용합니다. 실무에서는 SciPy의 내장 함수를 사용하는 것이 간편하고 안정적이며, 원리를 이해하고 싶다면 위와 같이 직접 구현해 보는 것도 좋은 학습 방법입니다.