Introduction
L'estimation de la covariance est une tâche importante en analyse statistique. Dans ce laboratoire, nous comparerons deux méthodes d'estimation de la covariance : Ledoit-Wolf et OAS. Nous utiliserons des données distribuées selon une loi normale pour comparer l'erreur quadratique moyenne estimée de ces deux méthodes.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.
Importation des bibliothèques
Tout d'abord, nous devons importer les bibliothèques nécessaires pour ce laboratoire. Nous utiliserons numpy pour les calculs numériques, matplotlib pour les visualisations et scikit-learn pour l'estimation de la covariance.
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz, cholesky
from sklearn.covariance import LedoitWolf, OAS
Générer des données
Ensuite, nous allons générer des données distribuées selon une loi normale avec une matrice de covariance qui suit un processus AR(1). Nous utiliserons les fonctions toeplitz et cholesky de scipy.linalg pour générer la matrice de covariance.
np.random.seed(0)
n_features = 100
r = 0.1
real_cov = toeplitz(r ** np.arange(n_features))
coloring_matrix = cholesky(real_cov)
Calculer l'erreur quadratique moyenne (MSE) et le resserrement
Nous comparerons les méthodes Ledoit-Wolf et OAS en utilisant les données simulées. Nous calculerons l'erreur quadratique moyenne (MSE) et le resserrement des deux méthodes.
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_
Tracer les résultats
Enfin, nous allons tracer les résultats pour comparer l'erreur quadratique moyenne (MSE) et le resserrement des méthodes Ledoit-Wolf et 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("Erreur carrée")
plt.legend(loc="upper right")
plt.title("Comparaison des estimateurs de covariance")
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("Resserrement")
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()
Sommaire
Dans ce laboratoire, nous avons comparé les méthodes Ledoit-Wolf et OAS pour l'estimation de la covariance en utilisant des données distribuées selon une loi normale. Nous avons tracé l'erreur quadratique moyenne (MSE) et le resserrement des deux méthodes et avons constaté que la méthode OAS présente une meilleure convergence sous l'hypothèse que les données sont gaussiennes.