Python でマハラノビス距離を計算する
-
Python の
scipy.spatial.distance
ライブラリのcdist()
関数を使用してマハラノビス距離を計算する -
Python の
numpy.einsum()
メソッドでマハラノビス距離を計算する
このチュートリアルでは、Python で 2つの NumPy 配列間のマハラノビス距離を見つける方法を紹介します。
Python の scipy.spatial.distance
ライブラリの cdist()
関数を使用してマハラノビス距離を計算する
マハラノビス距離は、点と分布の間の距離の尺度です。2つの配列間のマハラノビス距離を求めたい場合は、Python の scipy.spatial.distance
ライブラリ内の cdist()
関数を使用できます。cdist()
関数は、2つのコレクション間の距離を計算します。入力パラメータに 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()
メソッドを使用して、2つの配列間のマハラノビス距離を計算することもできます。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))
を計算して保存しました。。
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