协方差估计方法比较

在统计学中,估计数据集的协方差矩阵是一个重要任务。最大似然估计(MLE)虽然常用,但在某些情况下可能会产生不稳定的结果。为了解决这个问题,可以采用正则化技术,其中收缩(shrinkage)是一种流行的正则化方法。Ledoit和Wolf提出了一种计算渐近最优收缩参数的方法,该参数通过最小化均方误差(MSE)准则来确定,从而得到Ledoit-Wolf协方差估计。Chen等人进一步提出了OAS系数,这是对Ledoit-Wolf收缩参数的改进,其在假设数据为高斯分布的情况下收敛性能更佳。

本示例受到Chen等人发表的论文[1]的启发,展示了使用高斯分布数据估计LW和OAS方法的均方误差(MSE)的比较。文中提到的两种方法,Ledoit-Wolf和OAS,都旨在通过收缩技术来改善协方差矩阵的估计。收缩技术的核心思想是将样本协方差矩阵向一个目标矩阵收缩,以减少估计的不确定性。Ledoit-Wolf方法通过一个封闭公式计算收缩参数,而OAS方法则在Ledoit-Wolf的基础上进行了改进,以期获得更好的收敛性能。

为了比较这两种方法,生成了一系列不同样本大小的高斯分布数据,并分别使用Ledoit-Wolf和OAS方法估计协方差矩阵。通过计算每种方法的均方误差,可以评估它们在不同样本大小下的性能。实验结果表明,OAS方法在样本数量较少时,相较于Ledoit-Wolf方法,能够提供更准确的协方差估计

以下是实现这一比较的Python代码示例。代码中首先设置了随机数生成器的种子,以确保结果的可重复性。然后定义了特征数量,并构建了一个AR(1)过程的模拟协方差矩阵。接着,为不同的样本数量范围和重复次数准备了数据结构,用于存储每种方法的均方误差和收缩参数。在循环中,生成了正态分布的随机样本,并分别使用Ledoit-Wolf和OAS方法进行拟合,计算它们的均方误差和收缩参数。最后,使用matplotlib库绘制了均方误差和收缩系数的图表,以直观地展示两种方法的性能差异。

import matplotlib.pyplot as plt import numpy as np from scipy.linalg import cholesky, toeplitz from sklearn.covariance import OAS, LedoitWolf np.random.seed(0) n_features = 100 # 特征数量 r = 0.1 # AR(1)过程的参数 real_cov = toeplitz(r ** np.arange(n_features)) # 模拟协方差矩阵 coloring_matrix = cholesky(real_cov) # Cholesky分解 n_samples_range = np.arange(6, 31) # 不同的样本数量 repeat = 100 # 重复次数 lw_mse = np.zeros((len(n_samples_range), repeat)) # Ledoit-Wolf的MSE oa_mse = np.zeros((len(n_samples_range), repeat)) # OAS的MSE lw_shrinkage = np.zeros((len(n_samples_range), repeat)) # Ledoit-Wolf的收缩参数 oa_shrinkage = np.zeros((len(n_samples_range), repeat)) # OAS的收缩参数 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_ # 绘制MSE图表 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("Squared error") plt.legend(loc="upper right") plt.title("协方差估计器比较") 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("样本数量") plt.ylabel("收缩系数") 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()

通过上述代码,可以清楚地看到,在不同样本数量下,Ledoit-Wolf和OAS方法的均方误差和收缩系数的变化情况。这些图表为提供了直观的比较,帮助理解不同协方差估计方法在实际应用中的表现。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485