Estimação de Covariância Inversa Esparsa

Beginner

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

Introdução

Este laboratório demonstra como usar o estimador GraphicalLasso para aprender uma covariância e uma precisão esparsa a partir de um pequeno número de amostras. O tutorial cobre a geração de dados, a estimativa da covariância e o plote dos resultados.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Gerar os Dados

O primeiro passo é gerar os dados. Neste caso, estamos a gerar um pequeno conjunto de dados de 60 amostras com 20 características. Usamos uma matriz de covariância inversa esparsa para garantir condições favoráveis de recuperação.

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)

Estimar a Covariância

O segundo passo é estimar a covariância. Usamos o GraphicalLassoCV para aprender a matriz de precisão esparsa. Também comparamos os resultados com o estimador 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_)

Representar os Resultados

O terceiro passo é representar os resultados. Representamos as matrizes de covariância e precisão. Também representamos a métrica de seleção do modelo.

import matplotlib.pyplot as plt

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

## plot the covariances
covs = [
    ("Empírica", emp_cov),
    ("Ledoit-Wolf", lw_cov_),
    ("GraphicalLassoCV", cov_),
    ("Verdadeira", 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 covariância" % name)


## plot the precisions
precs = [
    ("Empírica", linalg.inv(emp_cov)),
    ("Ledoit-Wolf", lw_prec_),
    ("GraphicalLasso", prec_),
    ("Verdadeira", 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 precisão" % name)
    if hasattr(ax, "set_facecolor"):
        ax.set_facecolor(".7")
    else:
        ax.set_axis_bgcolor(".7")

## plot the model selection metric
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("Seleção do modelo")
plt.ylabel("Pontuação de validação cruzada")
plt.xlabel("alpha")

plt.show()

Resumo

Este laboratório demonstrou como usar o estimador GraphicalLasso para aprender uma covariância e uma precisão esparsa a partir de um pequeno número de amostras. O tutorial cobriu a geração de dados, a estimativa da covariância e a representação dos resultados.