Calcola la distanza di Mahalanobis in Python

Muhammad Maisam Abbas 30 gennaio 2023
  1. Calcola la distanza di Mahalanobis con la funzione cdist() nella libreria scipy.spatial.distance in Python
  2. Calcola la distanza di Mahalanobis con il metodo numpy.einsum() in Python
Calcola la distanza di Mahalanobis in Python

Questo tutorial introdurrà i metodi per trovare la distanza di Mahalanobis tra due array NumPy in Python.

Calcola la distanza di Mahalanobis con la funzione cdist() nella libreria scipy.spatial.distance in Python

La distanza di Mahalanobis è la misura della distanza tra un punto e una distribuzione. Se vogliamo trovare la distanza di Mahalanobis tra due array, possiamo usare la funzione cdist() all’interno della libreria scipy.spatial.distance in Python. La funzione cdist() calcola la distanza tra due raccolte. Possiamo specificare mahalanobis nei parametri di input per trovare la distanza di Mahalanobis. Vedere il seguente esempio di codice.

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)

Produzione:

[3.63263583 2.59094773 1.97370848 1.97370848 2.177978   3.04256456
 3.04256456 1.54080605 2.58298363]

Abbiamo calcolato e memorizzato la distanza di Mahalanobis tra gli array x e y con la funzione cdist() nel codice sopra. Per prima cosa abbiamo creato entrambi gli array con la funzione np.array(). Abbiamo quindi rimodellato entrambi gli array e salvato la trasposizione nei nuovi array xx e yy. Abbiamo quindi passato questi nuovi array alla funzione cdist() e specificato mahalanobis nei parametri con cdist(xx,yy,'mahalanobis').

Calcola la distanza di Mahalanobis con il metodo numpy.einsum() in Python

Possiamo anche calcolare la distanza di Mahalanobis tra due array usando il metodo numpy.einsum(). Il metodo numpy.einsum() viene utilizzato per valutare la convenzione di sommatoria di Einstein sui parametri di input.

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)

Produzione:

[3.63263583 2.59094773 1.97370848 1.97370848 2.177978   3.04256456
 3.04256456 1.54080605 2.58298363]

Abbiamo passato gli array alla funzione np.vstack() e memorizzato il valore all’interno della X. Successivamente, abbiamo passato la trasposizione di X alla funzione np.cov() e abbiamo memorizzato il risultato all’interno di V. Abbiamo quindi calcolato l’inverso moltiplicativo della matrice V e memorizzato il risultato in VI. Abbiamo calcolato la differenza tra xx e yy e archiviato i risultati in delta. Alla fine, abbiamo calcolato e memorizzato la distanza di Mahalanobis tra x e y con results = np.sqrt(np.einsum('nj,jk,nk->n', delta, VI, delta)).

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

Articolo correlato - Python NumPy