Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец для загрузки полного кода примера или для запуска этого примера в браузере через JupyterLite или Binder

Оценка ковариации с применением устойчивых методов и релевантность расстояний Махаланобиса

В этом примере показана оценка ковариации с расстояниями Махаланобиса на данных, распределенных по гауссову закону.

Для данных, распределенных по гауссову закону, расстояние наблюдения \(x_i\) до моды распределения можно вычислить с помощью расстояния Махаланобиса:

\[d_{(\mu,\Sigma)}(x_i)^2 = (x_i - \mu)^T\Sigma^{-1}(x_i - \mu)\]

где \(\mu\) и \(\Sigma\) — положение и ковариация базового гауссова распределения.

На практике \(\mu\) и \(\Sigma\) заменяются некоторыми оценками. Стандартная оценка максимального правдоподобия (MLE) ковариации очень чувствительна к присутствию выбросов в наборе данных, и поэтому расстояния Махаланобиса также будут. Лучше использовать устойчивую оценку ковариации, чтобы гарантировать, что оценка устойчива к «ошибочным» наблюдениям в наборе данных и что рассчитанные расстояния Махаланобиса точно отражают истинную структуру наблюдений.

Оценка с минимальным определителем ковариации (MCD) является устойчивой оценкой с высоким значением точки разрыва (т.е. она может использоваться для оценки матрицы ковариации сильно загрязненных наборов данных, до \(\frac{n_\text{samples}-n_\text{features}-1}{2}\) выбросов). Идея MCD заключается в том, чтобы найти \(\frac{n_\text{samples}+n_\text{features}+1}{2}\) наблюдений, у которых эмпирическая ковариация имеет наименьший определитель, что приводит к «чистой» подвыборке наблюдений, на основе которых вычисляются стандартные оценки положения и ковариации. MCD был введен П. Дж. Руссев в [1].

Этот пример иллюстрирует, как расстояния Махаланобиса зависят от выбросов. Наблюдения, взятые из распределения, вызывающего загрязнение, неотличимы от наблюдений, полученных из истинного гауссового распределения, при использовании стандартных расстояний Махаланобиса на основе оценки MLE ковариации. Использование расстояний Махаланобиса на основе MCD позволяет различить две популяции. Приложения включают обнаружение выбросов, ранжирование наблюдений и кластеризацию.

Примечание

См. также Устойчивая оценка ковариации по сравнению с эмпирической оценкой

Ссылки

[1]

P. J. Rousseeuw. Регрессия с наименьшим средним значением квадратов. J. Am Stat Ass, 79:871, 1984.

[2]

Wilson, E. B., & Hilferty, M. M. (1931). Распределение хи-квадрат. Proceedings of the National Academy of Sciences of the United States of America, 17, 684-688.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация данных

Сначала мы генерируем набор данных из 125 выборок и 2 признаков. Оба признака распределены по гауссову закону с математическим ожиданием 0, но признак 1 имеет стандартное отклонение, равное 2, а признак 2 имеет стандартное отклонение, равное 1. Затем 25 выборок заменяются на выборки выбросов, распределенных по гауссову закону, где признак 1 имеет стандартное отклонение, равное 1, а признак 2 имеет стандартное отклонение, равное 7.

import numpy as np

# for consistent results
np.random.seed(7)

n_samples = 125
n_outliers = 25
n_features = 2

# generate Gaussian data of shape (125, 2)
gen_cov = np.eye(n_features)
gen_cov[0, 0] = 2.0
X = np.dot(np.random.randn(n_samples, n_features), gen_cov)
# add some outliers
outliers_cov = np.eye(n_features)
outliers_cov[np.arange(1, n_features), np.arange(1, n_features)] = 7.0
X[-n_outliers:] = np.dot(np.random.randn(n_outliers, n_features), outliers_cov)

Сравнение результатов

Ниже мы подгоняем оценки ковариации на основе MCD и MLE к нашим данным и выводим оцененные матрицы ковариации. Обратите внимание, что оцененная дисперсия признака 2 значительно выше при оценке на основе MLE (7,5), чем при устойчивой оценке на основе MCD (1,2). Это показывает, что устойчивая оценка на основе MCD гораздо устойчивее к выбросам, которые были созданы для того, чтобы иметь значительно большую дисперсию в признаке 2.

import matplotlib.pyplot as plt

from sklearn.covariance import EmpiricalCovariance, MinCovDet

# fit a MCD robust estimator to data
robust_cov = MinCovDet().fit(X)
# fit a MLE estimator to data
emp_cov = EmpiricalCovariance().fit(X)
print(
    "Estimated covariance matrix:\nMCD (Robust):\n{}\nMLE:\n{}".format(
        robust_cov.covariance_, emp_cov.covariance_
    )
)
Estimated covariance matrix:
MCD (Robust):
[[ 3.26253567e+00 -3.06695631e-03]
 [-3.06695631e-03  1.22747343e+00]]
MLE:
[[ 3.23773583 -0.24640578]
 [-0.24640578  7.51963999]]

Для лучшей визуализации различий мы строим контуры расстояний Махаланобиса, рассчитанные обоими методами. Обратите внимание, что устойчивые расстояния Махаланобиса на основе MCD лучше соответствуют внутренним черным точкам, тогда как расстояния на основе MLE больше зависят от выбросов красного цвета.

import matplotlib.lines as mlines

fig, ax = plt.subplots(figsize=(10, 5))
# Plot data set
inlier_plot = ax.scatter(X[:, 0], X[:, 1], color="black", label="inliers")
outlier_plot = ax.scatter(
    X[:, 0][-n_outliers:], X[:, 1][-n_outliers:], color="red", label="outliers"
)
ax.set_xlim(ax.get_xlim()[0], 10.0)
ax.set_title("Mahalanobis distances of a contaminated data set")

# Create meshgrid of feature 1 and feature 2 values
xx, yy = np.meshgrid(
    np.linspace(plt.xlim()[0], plt.xlim()[1], 100),
    np.linspace(plt.ylim()[0], plt.ylim()[1], 100),
)
zz = np.c_[xx.ravel(), yy.ravel()]
# Calculate the MLE based Mahalanobis distances of the meshgrid
mahal_emp_cov = emp_cov.mahalanobis(zz)
mahal_emp_cov = mahal_emp_cov.reshape(xx.shape)
emp_cov_contour = plt.contour(
    xx, yy, np.sqrt(mahal_emp_cov), cmap=plt.cm.PuBu_r, linestyles="dashed"
)
# Calculate the MCD based Mahalanobis distances
mahal_robust_cov = robust_cov.mahalanobis(zz)
mahal_robust_cov = mahal_robust_cov.reshape(xx.shape)
robust_contour = ax.contour(
    xx, yy, np.sqrt(mahal_robust_cov), cmap=plt.cm.YlOrBr_r, linestyles="dotted"
)

# Add legend
ax.legend(
    [
        mlines.Line2D([], [], color="tab:blue", linestyle="dashed"),
        mlines.Line2D([], [], color="tab:orange", linestyle="dotted"),
        inlier_plot,
        outlier_plot,
    ],
    ["MLE dist", "MCD dist", "inliers", "outliers"],
    loc="upper right",
    borderaxespad=0,
)

plt.show()
Mahalanobis distances of a contaminated data set

Наконец, мы подчеркнем возможность расстояний Махаланобиса на основе MCD различать выбросы. Мы берем кубический корень из расстояний Махаланобиса, что дает приблизительно нормальные распределения (как предполагалось Уилсоном и Хилферти [2]), затем строим значения выборок с внутренними точками и с выбросами с помощью ящиков. Распределение выборок выбросов более отделено от распределения выборок с внутренними точками для расстояний Махаланобиса на основе устойчивой MCD.

fig, (ax1, ax2) = plt.subplots(1, 2)
plt.subplots_adjust(wspace=0.6)

# Calculate cubic root of MLE Mahalanobis distances for samples
emp_mahal = emp_cov.mahalanobis(X - np.mean(X, 0)) ** (0.33)
# Plot boxplots
ax1.boxplot([emp_mahal[:-n_outliers], emp_mahal[-n_outliers:]], widths=0.25)
# Plot individual samples
ax1.plot(
    np.full(n_samples - n_outliers, 1.26),
    emp_mahal[:-n_outliers],
    "+k",
    markeredgewidth=1,
)
ax1.plot(np.full(n_outliers, 2.26), emp_mahal[-n_outliers:], "+k", markeredgewidth=1)
ax1.axes.set_xticklabels(("inliers", "outliers"), size=15)
ax1.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax1.set_title("Using non-robust estimates\n(Maximum Likelihood)")

# Calculate cubic root of MCD Mahalanobis distances for samples
robust_mahal = robust_cov.mahalanobis(X - robust_cov.location_) ** (0.33)
# Plot boxplots
ax2.boxplot([robust_mahal[:-n_outliers], robust_mahal[-n_outliers:]], widths=0.25)
# Plot individual samples
ax2.plot(
    np.full(n_samples - n_outliers, 1.26),
    robust_mahal[:-n_outliers],
    "+k",
    markeredgewidth=1,
)
ax2.plot(np.full(n_outliers, 2.26), robust_mahal[-n_outliers:], "+k", markeredgewidth=1)
ax2.axes.set_xticklabels(("inliers", "outliers"), size=15)
ax2.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax2.set_title("Using robust estimates\n(Minimum Covariance Determinant)")

plt.show()
Using non-robust estimates (Maximum Likelihood), Using robust estimates (Minimum Covariance Determinant)

Общее время выполнения скрипта: (0 минут 0,266 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_mahalanobis_distances.ipynb

Download Python source code: plot_mahalanobis_distances.py

Download zipped: plot_mahalanobis_distances.zip

Связанные примеры

Устойчивая оценка ковариации по сравнению с эмпирической оценкой

Обнаружение выбросов на реальном наборе данных

Сравнение алгоритмов обнаружения аномалий для обнаружения выбросов на наборах данных с искусственными данными

Линейный и квадратичный дискриминантный анализ с эллипсоидом ковариации

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/covariance/plot_mahalanobis_distances.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API