Python에서 Mahalanobis 거리 계산

Muhammad Maisam Abbas 2023년1월30일
  1. Python의scipy.spatial.distance라이브러리의cdist()함수를 사용하여 Mahalanobis 거리 계산
  2. Python에서numpy.einsum()메서드를 사용하여 Mahalanobis 거리 계산
Python에서 Mahalanobis 거리 계산

이 튜토리얼은 Python에서 두 NumPy 배열 사이의 Mahalanobis 거리를 찾는 방법을 소개합니다.

Python의scipy.spatial.distance라이브러리의cdist()함수를 사용하여 Mahalanobis 거리 계산

Mahalanobis 거리는 점과 분포 사이의 거리를 측정 한 것입니다. 두 배열 사이의 Mahalanobis 거리를 찾으려면 Python의scipy.spatial.distance라이브러리 내에서cdist()함수를 사용할 수 있습니다. cdist()함수는 두 컬렉션 사이의 거리를 계산합니다. 입력 매개 변수에mahalanobis를 지정하여 Mahalanobis 거리를 찾을 수 있습니다. 다음 코드 예제를 참조하십시오.

import numpy as np
from scipy.spatial.distance import cdist

x = np.array([[[1, 2, 3], [3, 4, 5], [5, 6, 7]], [[5, 6, 7], [7, 8, 9], [9, 0, 1]]])

i, j, k = x.shape

xx = x.reshape(i, j * k).T


y = np.array([[[8, 7, 6], [6, 5, 4], [4, 3, 2]], [[4, 3, 2], [2, 1, 0], [0, 1, 2]]])


yy = y.reshape(i, j * k).T

results = cdist(xx, yy, "mahalanobis")

results = np.diag(results)
print(results)

출력:

[3.63263583 2.59094773 1.97370848 1.97370848 2.177978   3.04256456
 3.04256456 1.54080605 2.58298363]

위 코드에서cdist()함수를 사용하여xy배열 사이의 Mahalanobis 거리를 계산하고 저장했습니다. 먼저np.array()함수로 두 배열을 모두 만들었습니다. 그런 다음 두 배열의 모양을 변경하고 새 배열xxyy에 조옮김을 저장했습니다. 그런 다음 이러한 새 배열을cdist()함수에 전달하고cdist(xx,yy,'mahalanobis')를 사용하여 매개 변수에mahalanobis를 지정했습니다.

Python에서numpy.einsum()메서드를 사용하여 Mahalanobis 거리 계산

또한 numpy.einsum()메소드를 사용하여 두 배열 간의 Mahalanobis 거리를 계산할 수 있습니다. numpy.einsum()메소드는 입력 매개 변수에 대한 Einstein 합계 규칙을 평가하는 데 사용됩니다.

import numpy as np

x = np.array([[[1, 2, 3], [3, 4, 5], [5, 6, 7]], [[5, 6, 7], [7, 8, 9], [9, 0, 1]]])
i, j, k = x.shape

xx = x.reshape(i, j * k).T


y = np.array([[[8, 7, 6], [6, 5, 4], [4, 3, 2]], [[4, 3, 2], [2, 1, 0], [0, 1, 2]]])


yy = y.reshape(i, j * k).T

X = np.vstack([xx, yy])
V = np.cov(X.T)
VI = np.linalg.inv(V)
delta = xx - yy
results = np.sqrt(np.einsum("nj,jk,nk->n", delta, VI, delta))
print(results)

출력:

[3.63263583 2.59094773 1.97370848 1.97370848 2.177978   3.04256456
 3.04256456 1.54080605 2.58298363]

배열을np.vstack()함수에 전달하고 값을X안에 저장했습니다. 그 후X의 전치를np.cov()함수에 전달하고 결과를V에 저장했습니다. 그런 다음 행렬V의 곱셈 역수를 계산하고 결과를VI에 저장했습니다. xxyy의 차이를 계산하고 결과를delta에 저장했습니다. 결국,results = np.sqrt(np.einsum('nj,jk,nk->n', delta, VI, delta))를 사용하여xy사이의 Mahalanobis 거리를 계산하고 저장했습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

관련 문장 - Python NumPy