Python でマハラノビス距離を計算する

Muhammad Maisam Abbas 2023年1月30日
  1. Python の scipy.spatial.distance ライブラリの cdist() 関数を使用してマハラノビス距離を計算する
  2. Python の numpy.einsum() メソッドでマハラノビス距離を計算する
Python でマハラノビス距離を計算する

このチュートリアルでは、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() 関数を使用して、配列 xy の間のマハラノビス距離を計算して保存しました。最初に、np.array() 関数を使用して両方の配列を作成しました。次に、両方の配列の形状を変更し、転置を新しい配列 xxyy に保存しました。次に、これらの新しい配列を 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 に保存しました。xxyy の差を計算し、結果を delta に保存しました。最後に、xy の間のマハラノビス距離 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

関連記事 - Python NumPy