Перекрестная проверка - одна из тех досадно параллельных проблем.
Допустим, вы хотите проверить модель линейной регрессии. Предположим, что матрица плана X
имеет размеры n
на p
, а непрерывный результат y
представляет собой вектор n
на 1
. Далее предположим, что foldMatrix
является матрицей logicals
размером n
на k
. Каждый столбец представляет собой раздел: где 1
указывает, что наблюдение используется для обучения, а 0
означает, что оно используется для проверки. Этот трюк с обучающей проверкой повторяется k
раз, чтобы уменьшить дисперсию ошибки обобщения (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
, последовательная реализация выполняется быстрее, чем параллельная.Предварительно выделите разделы с проверкой поезда «явно» в массиве ячеек или трехмерной матрице. Результатом являются
k
полные копии данных (X
иy
).