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.