简介
协方差估计是统计分析中的一项重要任务。在本实验中,我们将比较两种协方差估计方法:Ledoit-Wolf 和 OAS。我们将使用高斯分布数据来比较这两种方法的估计均方误差(MSE)。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入库
首先,我们需要为本实验导入必要的库。我们将使用 numpy 进行数值计算,matplotlib 进行可视化,以及 scikit-learn 进行协方差估计。
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz, cholesky
from sklearn.covariance import LedoitWolf, OAS
生成数据
接下来,我们将生成具有遵循自回归(AR(1))过程的协方差矩阵的高斯分布数据。我们将使用 scipy.linalg 中的 toeplitz 和 cholesky 函数来生成协方差矩阵。
np.random.seed(0)
n_features = 100
r = 0.1
real_cov = toeplitz(r ** np.arange(n_features))
coloring_matrix = cholesky(real_cov)
计算均方误差(MSE)和收缩率
我们将使用模拟数据比较 Ledoit-Wolf 和 OAS 方法。我们将计算这两种方法的均方误差(MSE)和收缩率。
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_
绘制结果
最后,我们将绘制结果,以比较 Ledoit-Wolf 和 OAS 方法的均方误差(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("均方误差")
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("n_samples")
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 方法。我们绘制了两种方法的均方误差(MSE)和收缩率,并发现假设数据为高斯分布时,OAS 方法具有更好的收敛性。