Вычислить расстояние Махаланобиса в Python

  1. Вычислить расстояние Махаланобиса с помощью функции cdist() в библиотеке scipy.spatial.distance в Python
  2. Вычислить расстояние Махаланобиса с помощью метода numpy.einsum() в Python

В этом руководстве представлены методы определения расстояния Махаланобиса между двумя массивами NumPy в Python.

Вычислить расстояние Махаланобиса с помощью функции cdist() в библиотеке scipy.spatial.distance в Python

Расстояние Махаланобиса - это мера расстояния между точкой и распределением. Если мы хотим найти расстояние Махаланобиса между двумя массивами, мы можем использовать функцию cdist() внутри библиотеки scipy.spatial.distance в Python. Функция cdist() вычисляет расстояние между двумя коллекциями. Мы можем указать 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]

Мы вычислили и сохранили расстояние Махаланобиса между массивами x и y с помощью функции cdist() в приведенном выше коде. Сначала мы создали оба массива с помощью функции np.array(). Затем мы изменили форму обоих массивов и сохранили транспонирование в новых массивах xx и yy. Затем мы передали эти новые массивы функции cdist() и указали mahalanobis в параметрах с помощью cdist(xx,yy,'mahalanobis').

Вычислить расстояние Махаланобиса с помощью метода numpy.einsum() в Python

Мы также можем вычислить расстояние Махаланобиса между двумя массивами, используя numpy.einsum() метод. Метод numpy.einsum() используется для оценки соглашения Эйнштейна о суммировании входных параметров.

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. Мы рассчитали разницу между xx и yy и сохранили результаты в delta. В конце концов, мы вычислили и сохранили расстояние Махаланобиса между x и y с results = np.sqrt(np.einsum('nj,jk,nk->n', delta, VI, delta)).