Робастная оценка ковариации и связь с расстояниями Махаланобиса

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабораторном занятии мы исследуем применение устойчивой оценки ковариации с использованием расстояний Махаланобиса для данных, распределенных по Гауссу. Расстояние Махаланобиса - это мера расстояния между точкой и распределением. Оно определяется как расстояние между точкой и средним значением распределения, масштабированное обратной матрицей ковариации распределения. Для данных, распределенных по Гауссу, расстояние Махаланобиса можно использовать для вычисления расстояния наблюдения до моды распределения. Мы сравним производительность оценщика ковариации с минимальным детерминантом ковариации (MCD), устойчивого оценщика ковариации, с стандартным максимальным правдоподобием оценщиком ковариации (MLE) при вычислении расстояний Махаланобиса для зашумленного набора данных.

Советы по работе с ВМ

После завершения запуска ВМ нажмите в верхнем левом углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

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

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

import numpy as np

## для совместимости результатов
np.random.seed(7)

n_samples = 125
n_outliers = 25
n_features = 2

## генерируем гауссовские данные формы (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)
## добавляем некоторые выбросы
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 к данным

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

from sklearn.covariance import EmpiricalCovariance, MinCovDet

## применим устойчивый оценщик MCD к данным
robust_cov = MinCovDet().fit(X)
## применим оценщик MLE к данным
emp_cov = EmpiricalCovariance().fit(X)
print(
    "Estimated covariance matrix:\nMCD (Robust):\n{}\nMLE:\n{}".format(
        robust_cov.covariance_, emp_cov.covariance_
    )
)

Построение контуров расстояний Махаланобиса

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

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 5))
## Построение набора данных
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")

## Создание сетки значений для признака 1 и признака 2
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()]
## Вычисление расстояний Махаланобиса, основанных на MLE, для сетки
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"
)
## Вычисление расстояний Махаланобиса, основанных на MCD
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"
)

## Добавление легенды
ax.legend(
    [
        emp_cov_contour.collections[1],
        robust_contour.collections[1],
        inlier_plot,
        outlier_plot,
    ],
    ["MLE dist", "MCD dist", "inliers", "outliers"],
    loc="upper right",
    borderaxespad=0,
)

plt.show()

Сравнение расстояний Махаланобиса MLE и MCD

Мы выявим способность расстояний Махаланобиса, основанных на MCD, различать выбросы. Мы берем кубический корень из расстояний Махаланобиса, получая приблизительно нормальные распределения. Затем мы строим значения для выборок с внутренними и внешними точками с использованием ящиковых диаграмм. Распределение выборок с выбросами более отделено от распределения выборок с внутренними точками для расстояний Махаланобиса, основанных на устойчивом MCD.

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

## Вычисление кубического корня расстояний Махаланобиса MLE для выборок
emp_mahal = emp_cov.mahalanobis(X - np.mean(X, 0)) ** (0.33)
## Построение ящиковых диаграмм
ax1.boxplot([emp_mahal[:-n_outliers], emp_mahal[-n_outliers:]], widths=0.25)
## Построение отдельных выборок
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)")

## Вычисление кубического корня расстояний Махаланобиса MCD для выборок
robust_mahal = robust_cov.mahalanobis(X - robust_cov.location_) ** (0.33)
## Построение ящиковых диаграмм
ax2.boxplot([robust_mahal[:-n_outliers], robust_mahal[-n_outliers:]], widths=0.25)
## Построение отдельных выборок
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()

Резюме

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