Введение

Расстояние Махаланобиса — это статистический инструмент, используемый для измерения расстояния между точкой и распределением. Это мощный метод, который учитывает корреляции между переменными в наборе данных, что делает его ценным инструментом в различных приложениях, таких как обнаружение выбросов, кластеризация и классификация.

Например, давайте рассмотрим сценарий, в котором компания хочет выявить потенциальное мошенничество в транзакциях по кредитным картам. Компания собирает данные о различных переменных, таких как сумма транзакции, местоположение, время и другие детали транзакции по кредитной карте. Затем он использует расстояние Махаланобиса для измерения расстояния между каждой транзакцией и распределением всех сделок. Делая это, он может идентифицировать транзакции, которые значительно отличаются от остальных и могут указывать на мошенническую деятельность.

Расстояние Махаланобиса измеряет расстояние между точкой и распределением с учетом корреляции между переменными в данных. Это расстояние между точкой x и распределением со средним вектором μ и ковариационной матрицей Σ. Формула для расстояния Махаланобиса задается как:

D² = (x-μ)ᵀΣ⁻¹(x-μ)

Где D² — квадрат расстояния Махаланобиса, x — рассматриваемая точка, μ — средний вектор распределения, Σ — ковариационная матрица распределения, а ᵀ обозначает транспонирование матрицы.

Чтобы лучше понять эту формулу, давайте рассмотрим пример. Предположим, у нас есть набор данных, содержащий две переменные, X и Y, и мы хотим измерить расстояние между точкой (2, 3) и распределением всех точек в наборе данных. Мы вычисляем средний вектор и ковариационную матрицу набора данных следующим образом:

μ = [среднее (X), среднее (Y)] = [3, 4] Σ = [[var(X), cov(X,Y)], [cov(X,Y), var(Y)]] = [[2, -1], [-1, 2]]

Теперь мы можем использовать формулу расстояния Махаланобиса для расчета расстояния между точкой (2, 3) и распределением:

D² = ([2, 3]-[3, 4])ᵀ[[2, -1], [-1, 2]]⁻¹([2, 3]-[3, 4])

= [-1, -1]ᵀ[[2, -1], [-1, 2]]⁻¹[-1, -1]

= [2, -2]ᵀ[[2/3, 1/3], [1/3, 2/3]][2, -2]

= [2/3, -2/3]ᵀ[2, -2]

= 4/3.

Следовательно, квадрат расстояния Махаланобиса между точкой (2, 3) и распределением равен 4/3. Рассчитав расстояние Махаланобиса, мы можем определить, насколько далеко точка находится от распределения, учитывая корреляции между переменными X и Y.

import numpy as np
from scipy.spatial.distance import mahalanobis
from sklearn.datasets import make_blobs

# Create a dataset with 2 clusters
X, y = make_blobs(n_samples=100, centers=2, random_state=42)

# Calculate the mean vector and covariance matrix of the dataset
mu = np.mean(X, axis=0)
sigma = np.cov(X.T)

# Calculate the Mahalanobis Distance between two points
x1 = [2, 2]
x2 = [-2, -2]
dist_x1 = mahalanobis(x1, mu, np.linalg.inv(sigma))
dist_x2 = mahalanobis(x2, mu, np.linalg.inv(sigma))

# Print the distances
print("Distance between point x1 and the distribution:", dist_x1)
print("Distance between point x2 and the distribution:", dist_x2)

#OUTPUT

Distance between point x1 and the distribution: 2.099478227196236
Distance between point x2 and the distribution: 8.065203145117373

Вот несколько примеров того, как можно использовать расстояние Махаланобиса:

  1. Обнаружение выбросов. Расстояние Махаланобиса может обнаруживать выбросы в наборе данных. Выбросы — это точки данных, значительно отличающиеся от остальной части набора данных. Вычисляя расстояние Махаланобиса между каждой точкой данных и средним значением набора данных, мы можем определить точки данных, далекие от среднего значения. Эти точки данных можно считать выбросами и, возможно, потребуется их удаление или дальнейшее исследование.
  2. Кластеризация. Расстояние Махаланобиса также можно использовать для кластеризации точек данных. Кластеризация — это процесс группировки похожих точек данных вместе. Вычисляя расстояние Махаланобиса между каждой точкой данных и средним значением каждого кластера, мы можем определить, к какому кластеру принадлежит точка данных. Этот метод полезен для кластеризации точек данных с различными дисперсиями или ковариациями.
  3. Классификация изображений.Расстояние Махаланобиса можно использовать в задачах классификации изображений. Это приложение использует расстояние Махаланобиса для измерения сходства между тестовым изображением и набором обучающих изображений. Вычисляя расстояние Махаланобиса между тестовым изображением и каждым обучающим изображением, мы можем определить, какое обучающее изображение больше всего похоже на тестовое изображение. Этот метод полезен для таких задач, как распознавание лиц и обнаружение объектов.
  4. Обнаружение мошенничества. Расстояние Махаланобиса можно использовать для обнаружения мошенничества в финансовых транзакциях. Рассчитав расстояние Махаланобиса между транзакцией и набором исторических транзакций, мы можем определить, является ли транзакция необычной или подозрительной. Этот метод полезен для обнаружения мошеннических транзакций, которые в противном случае могут остаться незамеченными.

Вот пример того, как можно использовать расстояние Махаланобиса для создания красивых графиков для реального набора данных:

Для этого примера воспользуемся известным набором данных Iris, который содержит измерения для 150 цветков Iris. Мы будем использовать длину чашелистика, ширину и длину лепестка в качестве наших признаков.

Сначала мы рассчитаем расстояние Махаланобиса для каждой точки данных в наборе данных. Мы можем сделать это, используя следующий код на Python:

import numpy as np
from scipy.spatial.distance import mahalanobis

# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()

# calculate the mean and covariance matrix of the dataset
mean = np.mean(iris.data, axis=0)
cov = np.cov(iris.data.T)

# calculate the Mahalanobis distance for each data point
mahalanobis_dist = [mahalanobis(x, mean, np.linalg.inv(cov)) for x in iris.data]

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

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# create a color map for the Mahalanobis distances
cmap = ListedColormap(['r', 'g', 'b'])
norm = plt.Normalize(min(mahalanobis_dist), max(mahalanobis_dist))

# create a scatter plot of the iris dataset
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=mahalanobis_dist, cmap=cmap, norm=norm)

# add a color bar
plt.colorbar()
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('Mahalanobis Distance for Iris Dataset')
plt.show()

Вот еще один пример использования известного набора данных Wine, который поставляется с библиотекой sci-kit-learn:

import numpy as np
from scipy.spatial.distance import mahalanobis
import pandas as pd
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# load the wine dataset
wine = load_wine()
wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)

# calculate the mean and covariance matrix of the dataset
mean = np.mean(wine_df, axis=0)
cov = np.cov(wine_df.T)

# calculate the Mahalanobis distance for each data point
mahalanobis_dist = [mahalanobis(x, mean, np.linalg.inv(cov)) for x in wine_df.values]

# create a scatter plot of the wine dataset using two highly correlated features
plt.scatter(wine_df['flavanoids'], wine_df['color_intensity'], c=mahalanobis_dist, cmap='coolwarm')

# add a color bar
plt.colorbar()
plt.xlabel('flavanoids')
plt.ylabel('color_intensity')
plt.title('Mahalanobis Distance for Wine Dataset')
plt.show()