Введение
Расстояние Махаланобиса — это статистический инструмент, используемый для измерения расстояния между точкой и распределением. Это мощный метод, который учитывает корреляции между переменными в наборе данных, что делает его ценным инструментом в различных приложениях, таких как обнаружение выбросов, кластеризация и классификация.
Например, давайте рассмотрим сценарий, в котором компания хочет выявить потенциальное мошенничество в транзакциях по кредитным картам. Компания собирает данные о различных переменных, таких как сумма транзакции, местоположение, время и другие детали транзакции по кредитной карте. Затем он использует расстояние Махаланобиса для измерения расстояния между каждой транзакцией и распределением всех сделок. Делая это, он может идентифицировать транзакции, которые значительно отличаются от остальных и могут указывать на мошенническую деятельность.
Расстояние Махаланобиса измеряет расстояние между точкой и распределением с учетом корреляции между переменными в данных. Это расстояние между точкой 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
Вот несколько примеров того, как можно использовать расстояние Махаланобиса:
- Обнаружение выбросов. Расстояние Махаланобиса может обнаруживать выбросы в наборе данных. Выбросы — это точки данных, значительно отличающиеся от остальной части набора данных. Вычисляя расстояние Махаланобиса между каждой точкой данных и средним значением набора данных, мы можем определить точки данных, далекие от среднего значения. Эти точки данных можно считать выбросами и, возможно, потребуется их удаление или дальнейшее исследование.
- Кластеризация. Расстояние Махаланобиса также можно использовать для кластеризации точек данных. Кластеризация — это процесс группировки похожих точек данных вместе. Вычисляя расстояние Махаланобиса между каждой точкой данных и средним значением каждого кластера, мы можем определить, к какому кластеру принадлежит точка данных. Этот метод полезен для кластеризации точек данных с различными дисперсиями или ковариациями.
- Классификация изображений.Расстояние Махаланобиса можно использовать в задачах классификации изображений. Это приложение использует расстояние Махаланобиса для измерения сходства между тестовым изображением и набором обучающих изображений. Вычисляя расстояние Махаланобиса между тестовым изображением и каждым обучающим изображением, мы можем определить, какое обучающее изображение больше всего похоже на тестовое изображение. Этот метод полезен для таких задач, как распознавание лиц и обнаружение объектов.
- Обнаружение мошенничества. Расстояние Махаланобиса можно использовать для обнаружения мошенничества в финансовых транзакциях. Рассчитав расстояние Махаланобиса между транзакцией и набором исторических транзакций, мы можем определить, является ли транзакция необычной или подозрительной. Этот метод полезен для обнаружения мошеннических транзакций, которые в противном случае могут остаться незамеченными.
Вот пример того, как можно использовать расстояние Махаланобиса для создания красивых графиков для реального набора данных:
Для этого примера воспользуемся известным набором данных 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()