稀疏逆协方差估计

Beginner

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

简介

本实验展示了如何使用图形拉索估计器从少量样本中学习协方差和稀疏精度。本教程涵盖了数据生成、协方差估计以及结果绘制。

虚拟机使用提示

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

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

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

生成数据

第一步是生成数据。在这种情况下,我们要生成一个包含 60 个样本、20 个特征的小型数据集。我们使用稀疏逆协方差矩阵来确保良好的恢复条件。

import numpy as np
from scipy import linalg
from sklearn.datasets import make_sparse_spd_matrix

n_samples = 60
n_features = 20

prng = np.random.RandomState(1)
prec = make_sparse_spd_matrix(
    n_features, alpha=0.98, smallest_coef=0.4, largest_coef=0.7, random_state=prng
)
cov = linalg.inv(prec)
d = np.sqrt(np.diag(cov))
cov /= d
cov /= d[:, np.newaxis]
prec *= d
prec *= d[:, np.newaxis]
X = prng.multivariate_normal(np.zeros(n_features), cov, size=n_samples)
X -= X.mean(axis=0)
X /= X.std(axis=0)

估计协方差

第二步是估计协方差。我们使用图形拉索交叉验证(GraphicalLassoCV)来学习稀疏精度矩阵。我们还将结果与莱杜瓦 - 沃尔夫(Ledoit-Wolf)估计器进行比较。

from sklearn.covariance import GraphicalLassoCV, ledoit_wolf

emp_cov = np.dot(X.T, X) / n_samples

model = GraphicalLassoCV()
model.fit(X)
cov_ = model.covariance_
prec_ = model.precision_

lw_cov_, _ = ledoit_wolf(X)
lw_prec_ = linalg.inv(lw_cov_)

绘制结果

第三步是绘制结果。我们绘制协方差矩阵和精度矩阵,还绘制模型选择指标。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.subplots_adjust(left=0.02, right=0.98)

## 绘制协方差矩阵
covs = [
    ("经验协方差", emp_cov),
    ("莱杜瓦 - 沃尔夫协方差", lw_cov_),
    ("图形拉索交叉验证协方差", cov_),
    ("真实协方差", cov),
]
vmax = cov_.max()
for i, (name, this_cov) in enumerate(covs):
    plt.subplot(2, 4, i + 1)
    plt.imshow(
        this_cov, interpolation="nearest", vmin=-vmax, vmax=vmax, cmap=plt.cm.RdBu_r
    )
    plt.xticks(())
    plt.yticks(())
    plt.title("%s协方差" % name)


## 绘制精度矩阵
precs = [
    ("经验精度", linalg.inv(emp_cov)),
    ("莱杜瓦 - 沃尔夫精度", lw_prec_),
    ("图形拉索精度", prec_),
    ("真实精度", prec),
]
vmax = 0.9 * prec_.max()
for i, (name, this_prec) in enumerate(precs):
    ax = plt.subplot(2, 4, i + 5)
    plt.imshow(
        np.ma.masked_equal(this_prec, 0),
        interpolation="nearest",
        vmin=-vmax,
        vmax=vmax,
        cmap=plt.cm.RdBu_r,
    )
    plt.xticks(())
    plt.yticks(())
    plt.title("%s精度" % name)
    if hasattr(ax, "set_facecolor"):
        ax.set_facecolor(".7")
    else:
        ax.set_axis_bgcolor(".7")

## 绘制模型选择指标
plt.figure(figsize=(4, 3))
plt.axes([0.2, 0.15, 0.75, 0.7])
plt.plot(model.cv_results_["alphas"], model.cv_results_["mean_test_score"], "o-")
plt.axvline(model.alpha_, color=".5")
plt.title("模型选择")
plt.ylabel("交叉验证分数")
plt.xlabel("alpha")

plt.show()

总结

本实验展示了如何使用图形拉索估计器从少量样本中学习协方差和稀疏精度。本教程涵盖了数据生成、协方差估计以及结果绘制。