如何找到导致泛化误差最小的主成分的数量?

计算科学 matlab 机器学习 误差估计
2021-12-20 13:24:33

我正在写一篇论文,其中一部分是应用验证规则来找出有多少主成分给我们带来最小的泛化错误。

这个概念或多或少是这样的:“鉴于模型的维度减少了,我们将窗口大小重置为 60 天以避免过度拟合问题。使用 60 天的训练集在前 20 个组件中运行多元线性回归后,我们发现前 12 个分量在 30 个测试日的泛化误差最小。最后,我们计算样本内和样本外残差。

请注意,完整主成分矩阵的维度为 483(天)X 482(值)。

实现确实是微不足道的,但我正在扼杀如何为任何这些情况“选择”正确的子矩阵。

欢迎所有建议(包括 matlab 代码)。

编辑: 使用下面提到的 Arnold Neumaier的交叉验证提示,并且假设我已经实现了将初始数据集拆分为多个部分的功能,以下解决方案是否部分解决了问题?接下来我该怎么办?

for i=1:1:10
  training_set = ex1_data_txt(find(split_assignments(:,i)==0),:);
  test_set = ex1_data_txt(find(split_assignments(:,i)==1),:);

  % determine weights from the training set
  phi_train=[training_set(:,1).^(0) training_set(:,1).^(1)];
  w=pinv(phi_train)*training_set(:,2);
  phi_test=[test_set(:,1).^(0) test_set(:,1).^(1)];
  % apply learned weights to the test set and compute MSE
  MSE(i)=sum((test_set(:,2)-phi_test*w).^2)/size(test_set,1);
end
1个回答

通过交叉验证。将您的数据集分成大小大致相同的 5 个随机批次。将估计过程应用 5 次,始终遗漏一批,并通过对余数进行测试来计算每个有效维度选择的泛化误差。平均这些泛化错误。(如果您想谨慎行事,请考虑将平均值放在平均值加上倍的标准偏差,对于您认为可以解决您的风险规避水平的kk

这为您提供了一条曲线,您可以从中读出答案。

如果曲线有一个明显的最小值,它会为您提供有效尺寸。

相反,如果曲线具有基本平坦的底部区域,它会为您提供有效维度的无差异区间,并且根据奥卡姆剃刀,您将选择无差异区间中的最小值作为有效维度。

之后,您可以使用这个有效维度对完整数据集进行 PCA,并且可以预期在未见过的数据上会出现类似的泛化错误。但当然只有当原始数据代表非种子数据时。

可以沿着类似的路线选择窗口大小等。