Python 中的稳健协方差估计

Beginner

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

简介

在本实验中,你将学习如何使用 Python 中的 scikit-learn 库来估计稳健协方差矩阵。本教程将向你介绍稳健协方差估计的概念,并演示如何使用它来估计被异常值污染的数据集的协方差矩阵。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库

第一步是导入所需的库。在本教程中,我们将使用 NumPy、Matplotlib 和 scikit-learn。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.covariance import MinCovDet, EmpiricalCovariance

生成数据

在这一步中,我们生成一个具有 n_samples 个样本和 n_features 个特征的随机数据集。我们还向数据集中添加了一些异常值。

n_samples = 80
n_features = 5

## 生成随机数据集
rng = np.random.RandomState(42)
X = rng.randn(n_samples, n_features)

## 向数据集中添加异常值
n_outliers = 20
异常值索引 = rng.permutation(n_samples)[:n_outliers]
异常值偏移量 = 10.0 * (
    np.random.randint(2, size=(n_outliers, n_features)) - 0.5
)
X[异常值索引] += 异常值偏移量

估计稳健协方差矩阵

在这一步中,我们使用最小协方差行列式(Minimum Covariance Determinant,MCD)估计器来估计数据集的稳健协方差矩阵。

## 估计数据集的稳健协方差矩阵
mcd = MinCovDet().fit(X)
稳健协方差 = mcd.covariance_

估计经验协方差矩阵

在这一步中,我们使用最大似然估计(Maximum Likelihood Estimate,MLE)估计器来估计数据集的经验协方差矩阵。

## 估计数据集的经验协方差矩阵
emp_cov = EmpiricalCovariance().fit(X).covariance_

比较协方差矩阵

在这一步中,我们比较数据集中估计出的稳健协方差矩阵和经验协方差矩阵。

## 比较估计出的协方差矩阵
print("稳健协方差矩阵:")
print(robust_cov)
print("\n经验协方差矩阵:")
print(emp_cov)

可视化结果

在这一步中,我们将稳健和经验协方差估计的结果进行可视化。

## 可视化结果
fig, ax = plt.subplots()

## 绘制数据集
内点索引 = np.arange(n_samples)[~np.in1d(np.arange(n_samples), 异常值索引)]
ax.scatter(
    X[内点索引, 0], X[内点索引, 1], color="black", label="内点"
)
ax.scatter(X[异常值索引, 0], X[异常值索引, 1], color="red", label="异常值")

## 绘制估计的协方差矩阵
for 协方差, 颜色, 标签 in zip(
    [emp_cov, robust_cov], ["green", "magenta"], ["MLE", "MCD"]
):
    v, w = np.linalg.eigh(协方差)
    u = w[0] / np.linalg.norm(w[0])
    角度 = np.arctan2(u[1], u[0])
    角度 = 180 * 角度 / np.pi
    v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
    ell = mpl.patches.Ellipse(
        mcd.location_,
        v[0],
        v[1],
        180 + 角度,
        color=颜色,
        label=标签,
        alpha=0.2,
    )
    ell.set_clip_box(ax.bbox)
    ell.set_facecolor(颜色)
    ax.add_artist(ell)

## 设置绘图选项
plt.legend()
plt.title("稳健协方差估计")
plt.show()

总结

在本教程中,你已经学习了如何使用 Python 中的 scikit-learn 库来估计稳健协方差矩阵。你还学习了如何使用最小协方差行列式(MCD)估计器来估计被异常值污染的数据集的协方差矩阵。