【发布时间】:2015-08-26 16:30:50
【问题描述】:
交叉验证是embarrassingly parallel 问题之一。
假设您想要交叉验证线性回归模型。假设设计矩阵X 具有维度n-by-p 并且连续结果y 是n-by-1 向量。进一步假设foldMatrix 是n-by-k 矩阵logicals。每列代表一个分区:1 表示观察用于训练,0 表示用于验证。这种训练验证技巧重复k 次,以减少generalization error (GE) 估计的方差。
我(天真的?)在 Matlab 中进行并行交叉验证的方法如下所示:
matlabpool
GE = nan(k,1);
parfor i = 1:k
trainIndices = foldMatrix(:, i);
b = X(trainIndices, :)\y(trainIndices, :);
GE(i) = mean( (y(~trainIndices, :) - X(~trainIndices, :)*b).^2 );
end
mspe = mean(GE);
当您这样做时,Matlab 将抱怨“X 已被索引但未在 PARFOR 循环中切片。这可能会导致不必要的通信开销”(y 的同义词)。
我的问题是:
- 编辑:有什么方法可以在 Matlab 中使用并行实现来加速交叉验证?
- 是否有一种高效/优雅的方法来解决
X和y变量未被切片的问题?
我觉得不太优雅的两个“解决方案”是:
忽略唠叨。对于小问题,比如
p < 100、n < 3000和k < 40,顺序实现比并行实现要快。在元胞数组或 3 维矩阵中“显式”地预分配训练验证分区。导致
k数据的完整副本(X和y)。
【问题讨论】:
标签: matlab cross-validation parfor