在 Python 中計算馬氏距離
本教程將介紹在 Python 中求兩個 NumPy 陣列之間的馬氏距離的方法。
使用 Python 中 scipy.spatial.distance
庫中的 cdist()
函式計算馬氏距離
馬氏距離是點與分佈之間距離的度量。如果我們想找到兩個陣列之間的馬氏距離,我們可以使用 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()
函式計算並儲存了陣列 x
和 y
之間的馬氏距離。我們首先使用 np.array()
函式建立了兩個陣列。然後我們重新調整兩個陣列的形狀並將轉置儲存在新陣列 xx
和 yy
中。然後我們將這些新陣列傳遞給 cdist()
函式,並在引數中使用 cdist(xx,yy,'mahalanobis')
指定 mahalanobis
。
在 Python 中使用 numpy.einsum()
方法計算馬氏距離
我們還可以使用 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
中。最後,我們使用 results = np.sqrt(np.einsum('nj,jk,nk->n', delta, VI, delta))
計算並儲存了 x
和 y
之間的馬氏距離。
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