Comparación de estimadores de covarianza

Beginner

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

Introducción

La estimación de covarianza es una tarea importante en el análisis estadístico. En este laboratorio, compararemos dos métodos de estimación de covarianza: Ledoit-Wolf y OAS. Utilizaremos datos distribuidos gaussianamente para comparar el MSE estimado de estos dos métodos.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar bibliotecas

Primero, necesitamos importar las bibliotecas necesarias para este laboratorio. Utilizaremos numpy para cálculos numéricos, matplotlib para visualizaciones y scikit-learn para la estimación de covarianza.

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

Generar datos

A continuación, generaremos datos distribuidos gaussianamente con una matriz de covarianza que sigue un proceso AR(1). Utilizaremos las funciones toeplitz y cholesky de scipy.linalg para generar la matriz de covarianza.

np.random.seed(0)

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

Calcular el error cuadrático medio (MSE) y el encogimiento

Compararemos los métodos Ledoit-Wolf y OAS utilizando los datos simulados. Calcularemos el error cuadrático medio (MSE) y el encogimiento de ambos 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_

Graficar los resultados

Finalmente, graficaremos los resultados para comparar el error cuadrático medio (MSE) y el encogimiento de los métodos Ledoit-Wolf y 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("Error al cuadrado")
plt.legend(loc="upper right")
plt.title("Comparación de estimadores de covarianza")
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("Encogimiento")
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()

Resumen

En este laboratorio, comparamos los métodos Ledoit-Wolf y OAS para la estimación de covarianza utilizando datos distribuidos gaussianamente. Graficamos el error cuadrático medio (MSE) y el encogimiento de ambos métodos y encontramos que el método OAS tiene una mejor convergencia bajo la suposición de que los datos son gaussianos.