Comparação de Estimadores de Covariância

Beginner

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

Introdução

A estimação de covariância é uma tarefa importante na análise estatística. Neste laboratório, compararemos dois métodos de estimação de covariância: Ledoit-Wolf e OAS. Usaremos dados distribuídos gaussianamente para comparar o MSE estimado desses dois métodos.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

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 o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas

Primeiro, precisamos importar as bibliotecas necessárias para este laboratório. Usaremos numpy para cálculos numéricos, matplotlib para visualizações e scikit-learn para a estimação de covariância.

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz, cholesky
from sklearn.covariance import LedoitWolf, OAS

Gerar Dados

Em seguida, geraremos dados distribuídos gaussianamente com uma matriz de covariância que segue um processo AR(1). Usaremos as funções toeplitz e cholesky de scipy.linalg para gerar a matriz de covariância.

np.random.seed(0)

n_features = 100
r = 0.1
real_cov = toeplitz(r ** np.arange(n_features))
coloring_matrix = cholesky(real_cov)

Calcular MSE e Encolhimento

Vamos comparar os métodos Ledoit-Wolf e OAS usando os dados simulados. Calcularemos o erro quadrático médio (MSE) e o encolhimento de ambos os métodos.

n_samples_range = np.arange(6, 31, 1)
repeat = 100
lw_mse = np.zeros((n_samples_range.size, repeat))
oa_mse = np.zeros((n_samples_range.size, repeat))
lw_shrinkage = np.zeros((n_samples_range.size, repeat))
oa_shrinkage = np.zeros((n_samples_range.size, repeat))

for i, n_samples in enumerate(n_samples_range):
    for j in range(repeat):
        X = np.dot(np.random.normal(size=(n_samples, n_features)), coloring_matrix.T)

        lw = LedoitWolf(store_precision=False, assume_centered=True)
        lw.fit(X)
        lw_mse[i, j] = lw.error_norm(real_cov, scaling=False)
        lw_shrinkage[i, j] = lw.shrinkage_

        oa = OAS(store_precision=False, assume_centered=True)
        oa.fit(X)
        oa_mse[i, j] = oa.error_norm(real_cov, scaling=False)
        oa_shrinkage[i, j] = oa.shrinkage_

Plotar Resultados

Finalmente, vamos plotar os resultados para comparar o MSE e o encolhimento dos métodos Ledoit-Wolf e OAS.

plt.subplot(2, 1, 1)
plt.errorbar(
    n_samples_range,
    lw_mse.mean(1),
    yerr=lw_mse.std(1),
    label="Ledoit-Wolf",
    color="navy",
    lw=2,
)
plt.errorbar(
    n_samples_range,
    oa_mse.mean(1),
    yerr=oa_mse.std(1),
    label="OAS",
    color="darkorange",
    lw=2,
)
plt.ylabel("Erro quadrático")
plt.legend(loc="upper right")
plt.title("Comparação de estimadores de covariância")
plt.xlim(5, 31)

plt.subplot(2, 1, 2)
plt.errorbar(
    n_samples_range,
    lw_shrinkage.mean(1),
    yerr=lw_shrinkage.std(1),
    label="Ledoit-Wolf",
    color="navy",
    lw=2,
)
plt.errorbar(
    n_samples_range,
    oa_shrinkage.mean(1),
    yerr=oa_shrinkage.std(1),
    label="OAS",
    color="darkorange",
    lw=2,
)
plt.xlabel("n_samples")
plt.ylabel("Encolhimento")
plt.legend(loc="lower right")
plt.ylim(plt.ylim()[0], 1.0 + (plt.ylim()[1] - plt.ylim()[0]) / 10.0)
plt.xlim(5, 31)

plt.show()

Resumo

Neste laboratório, comparamos os métodos Ledoit-Wolf e OAS para a estimação de covariância utilizando dados distribuídos gaussianamente. Plotamos o MSE e o encolhimento de ambos os métodos e verificamos que o método OAS apresenta melhor convergência sob a hipótese de que os dados são gaussianos.