Robuste Kovarianzschätzung und Relevanz von Mahalanobis-Distanzen

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir die Verwendung der robusten Kovarianzschätzung mit Mahalanobis-Distanzen für gaussverteilt Daten untersuchen. Die Mahalanobis-Distanz misst die Entfernung zwischen einem Punkt und einer Verteilung. Sie wird definiert als die Entfernung zwischen einem Punkt und dem Mittelwert der Verteilung, skaliert mit der Inverse der Kovarianzmatrix der Verteilung. Für gaussverteilt Daten kann die Mahalanobis-Distanz verwendet werden, um die Entfernung einer Beobachtung zum Modalwert der Verteilung zu berechnen. Wir werden die Leistung des Minimum Covariance Determinant (MCD)-Schätzers, eines robusten Schätzers für die Kovarianz, mit dem Standard-Kovarianz-Maximum-Likelihood-Schätzer (MLE) bei der Berechnung der Mahalanobis-Distanzen eines kontaminierten Datensatzes vergleichen.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/covariance("Covariance Estimators") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/covariance -.-> lab-49207{{"Robuste Kovarianzschätzung und Relevanz von Mahalanobis-Distanzen"}} ml/sklearn -.-> lab-49207{{"Robuste Kovarianzschätzung und Relevanz von Mahalanobis-Distanzen"}} end

Daten generieren

Zunächst generieren wir einen Datensatz mit 125 Proben und 2 Merkmalen. Beide Merkmale sind gaussverteilt mit einem Mittelwert von 0. Merkmal 1 hat jedoch eine Standardabweichung von 2 und Merkmal 2 hat eine Standardabweichung von 1. Anschließend ersetzen wir 25 Proben mit gaussischen Ausreißerproben, bei denen Merkmal 1 eine Standardabweichung von 1 und Merkmal 2 eine Standardabweichung von 7 hat.

import numpy as np

## für konsistente Ergebnisse
np.random.seed(7)

n_samples = 125
n_outliers = 25
n_features = 2

## generiere gaussianische Daten von der Form (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)
## füge einige Ausreißer hinzu
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- und MLE-Kovarianzschätzer an die Daten anpassen

Wir werden die auf MCD und MLE basierenden Kovarianzschätzer an unsere Daten anpassen und die geschätzten Kovarianzmatrizen ausgeben. Beachten Sie, dass die geschätzte Varianz von Merkmal 2 mit dem auf MLE basierenden Schätzer (7,5) viel höher ist als die des robusten MCD-Schätzers (1,2). Dies zeigt, dass der robuste MCD-basierte Schätzer viel widerstandsfähiger gegenüber den Ausreißerproben ist, die so konzipiert wurden, dass Merkmal 2 eine viel größere Varianz hat.

from sklearn.covariance import EmpiricalCovariance, MinCovDet

## passe einen robusten MCD-Schätzer an die Daten an
robust_cov = MinCovDet().fit(X)
## passe einen MLE-Schätzer an die Daten an
emp_cov = EmpiricalCovariance().fit(X)
print(
    "Geschätzte Kovarianzmatrix:\nMCD (Robust):\n{}\nMLE:\n{}".format(
        robust_cov.covariance_, emp_cov.covariance_
    )
)

Mahalanobis-Distanzen konturieren

Wir werden die Konturen der Mahalanobis-Distanzen, die von beiden Methoden berechnet werden, darstellen. Beachten Sie, dass die robusten Mahalanobis-Distanzen auf der Grundlage von MCD die inneren schwarzen Punkte viel besser anpassen, während die auf MLE basierenden Distanzen stärker von den äußeren roten Punkten beeinflusst werden.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 5))
## Zeichne den Datensatz
inlier_plot = ax.scatter(X[:, 0], X[:, 1], color="black", label="innerer Punkt")
outlier_plot = ax.scatter(
    X[:, 0][-n_outliers:], X[:, 1][-n_outliers:], color="red", label="äußerer Punkt"
)
ax.set_xlim(ax.get_xlim()[0], 10.0)
ax.set_title("Mahalanobis-Distanzen eines kontaminierten Datensatzes")

## Erstelle ein Gitter von Merkmal-1- und Merkmal-2-Werten
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()]
## Berechne die auf MLE basierenden Mahalanobis-Distanzen des Gitters
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"
)
## Berechne die auf MCD basierenden Mahalanobis-Distanzen
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"
)

## Füge eine Legende hinzu
ax.legend(
    [
        emp_cov_contour.collections[1],
        robust_contour.collections[1],
        inlier_plot,
        outlier_plot,
    ],
    ["MLE-Dist", "MCD-Dist", "innerer Punkt", "äußerer Punkt"],
    loc="upper right",
    borderaxespad=0,
)

plt.show()

MLE- und MCD-Mahalanobis-Distanzen vergleichen

Wir werden die Fähigkeit der auf MCD basierenden Mahalanobis-Distanzen, Ausreißer zu erkennen, hervorheben. Wir berechnen die Kubikwurzel der Mahalanobis-Distanzen, was annähernd normale Verteilungen ergibt. Anschließend stellen wir die Werte der inneren und äußeren Proben mit Boxplots dar. Die Verteilung der äußeren Proben ist für die robusten Mahalanobis-Distanzen auf der Grundlage von MCD stärker von der Verteilung der inneren Proben getrennt.

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

## Berechne die Kubikwurzel der MLE-Mahalanobis-Distanzen für die Proben
emp_mahal = emp_cov.mahalanobis(X - np.mean(X, 0)) ** (0.33)
## Zeichne Boxplots
ax1.boxplot([emp_mahal[:-n_outliers], emp_mahal[-n_outliers:]], widths=0.25)
## Zeichne einzelne Proben
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(("innerer Punkt", "äußerer Punkt"), size=15)
ax1.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax1.set_title("Verwendung nicht-robuster Schätzungen\n(Maximum Likelihood)")

## Berechne die Kubikwurzel der MCD-Mahalanobis-Distanzen für die Proben
robust_mahal = robust_cov.mahalanobis(X - robust_cov.location_) ** (0.33)
## Zeichne Boxplots
ax2.boxplot([robust_mahal[:-n_outliers], robust_mahal[-n_outliers:]], widths=0.25)
## Zeichne einzelne Proben
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(("innerer Punkt", "äußerer Punkt"), size=15)
ax2.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax2.set_title("Verwendung robuster Schätzungen\n(Minimum Covariance Determinant)")

plt.show()

Zusammenfassung

In diesem Lab haben wir uns mit der robusten Kovarianzschätzung mit Mahalanobis-Distanzen für gaussverteiltes Daten beschäftigt. Wir haben die Leistung der auf MCD und MLE basierenden Kovarianzschätzer bei der Berechnung der Mahalanobis-Distanzen eines kontaminierten Datensatzes verglichen. Wir haben festgestellt, dass der robuste MCD-basierte Schätzer viel widerstandsfähiger gegenüber den Ausreißerproben ist und dass die auf MCD basierenden Mahalanobis-Distanzen besser darin sind, Ausreißer zu erkennen.